Вам нужна другая переменная 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; }
Не настолько симпатичный, как один лайнер, но код ниже должен работать (и Вы могли всегда делать некоторое метапрограммирование для записи 'неизменного' метода),
def address_id=(id)
if new_record?
write_attribute(:address_id, id)
else
raise 'address is immutable!'
end
end