有一个简单的例子:
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语句不运行?
答案 0 :(得分:1)
如果已找到数据集,则需要另一个变量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; }
答案 1 :(得分:0)
解决这个问题的一种可能更具可读性的方法是使用Array#find
,如下所示:
from datetime import timedelta
with open('events.json') as json_file:
data = json.load(json_file, )
day_start = 28
for tuple in data:
tuple['start'] = (calendar.timegm(time.gmtime()) - int(timedelta(days = day_start).total_seconds()))*1000
tuple['end'] = (calendar.timegm(time.gmtime()) - int(timedelta(days = day_start-1).total_seconds()))*1000
day_start -= 2
with open('dataEvents.json', 'w') as outfile:
json.dump(data, outfile)
答案 2 :(得分:0)
您可以使用数组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)