Не могу чисто вырваться из цикла for в JavaScript - PullRequest
0 голосов
/ 20 января 2019

Вот простой пример:

const arr = [
  {name: 'first', amount: 2},
  {name: 'second', amount: 1},
  {name: 'third', amount: 1}
]
const obj = {name: 'second', amount: 3}

for (let i = 0; i < arr.length; i++) {
  if (arr[i].name === obj.name) {
    arr[i].amount += obj.amount;
    break;
  } else {
    arr.push(obj)
  }
}

Я хочу выполнить обычный цикл for, и желаемый результат заключается в том, что если есть объект с тем же именем, что и в массиве, то просто сложите amount, иначе я хочу, чтобы obj был выдвинут в список.Но на самом деле оба события случаются.Как сделать так, чтобы я вырвался из оператора if, оператор else не запустится?

Ответы [ 3 ]

0 голосов
/ 20 января 2019

Возможно, более читаемый способ решить эту проблему - использовать Array#find следующим образом:

const arr = [
  {name: 'first', amount: 2},
  {name: 'second', amount: 1},
  {name: 'third', amount: 1}
];
const obj = {name: 'second', amount: 3};

const element = arr.find(el => el.name === obj.name);

if (element) {
  element.amount += obj.amount;
} else {
  arr.push(obj);
}

console.log(arr);
0 голосов
/ 20 января 2019

Вы можете использовать массив findIndex и проверить, существует ли объект, имя которого совпадает с именем объекта. findIndex возврат -1 результат не найден. В этом случае нажмите obj в массиве, иначе обновите значение суммы

const arr = [{
    name: 'first',
    amount: 2
  },
  {
    name: 'second',
    amount: 1
  },
  {
    name: 'third',
    amount: 1
  }
]
const obj = {
  name: 'second',
  amount: 3
}


let ifKeyExist = arr.findIndex((item) => {
  return item.name === obj.name
})

if (ifKeyExist === -1) {
  arr.push(obj)
} else {
  arr[ifKeyExist].amount += obj.amount
}
console.log(arr)
0 голосов
/ 20 января 2019

Вам нужна другая переменная found и установите ее на true, если набор данных найден.Затем не помещайте фактический набор данных в массив.

В основном вам необходимо посетить все элементы и в конце решить, добавите ли вы объект в массив.

С вашим кодом вывыполните хотя бы одно действие, либо обновите фактический конец набора данных, который работает только в том случае, если требуемый name находится в первом элементе, либо вставьте объект в массив.Это происходит до тех пор, пока не будет найден требуемый набор данных или больше нет доступных элементов.

const arr = [{ name: 'first', amount: 2 }, { name: 'second', amount: 1 }, { name: 'third', amount: 1 }];
const obj = { name: 'second', amount: 3 };

var found = false;

for (let i = 0; i < arr.length; i++) {
    if (arr[i].name === obj.name) {
        arr[i].amount += obj.amount;
        found = true;
        break;
    }
}

if (!found) {
    arr.push(obj);
}

console.log(arr);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...