无法彻底摆脱javascript中的for循环

时间:2019-01-20 09:31:48

标签: javascript arrays loops

有一个简单的例子:

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 :(得分: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)