我当前有一个如下数组:
let arr = [{ foo: "bar", number: 1 }, { foo: "bar1", number: 2 }, { foo: "bar2", number: 3 }]
我想确保数组中没有重复项,所以我有以下功能:
function test(foo) {
let i = { foo, number: 1 };
for (let t = 0; t < this.arr.length; t++) {
if (this.arr[t].foo === foo) {
this.arr[t].number += 1;
break;
} else {
this.arr.push(i);
break
}
}
}
如果我执行test(bar)
,bar
的值将成功增加到2。
[{ foo: "bar", number: 2 }, { foo: "bar1", number: 2 }, { foo: "bar2", number: 3 }]
但是,如果我执行test(bar1)
,则bar1
的值不会增加。而是一个新对象
{foo: "bar1", number: 1}
被推入数组。这将导致数组变为
[{ foo: "bar", number: 2 }, { foo: "bar1", number: 2 }, { foo: "bar2", number: 3 }, {foo: "bar1", number: 1}]
这是怎么回事?
答案 0 :(得分:2)
撇开上述内容不能干净地编译(this
)的事实,问题是,您从未检查第一个元素之后的arr
的任何元素。而不是让t
进入1
,而是将新对象推到数组上并break
循环。我猜你宁愿做这样的事情:
function test(foo: string) {
let i = { foo, number: 1 };
for (let t = 0; t < arr.length; t++) {
if (arr[t].foo === foo) {
arr[t].number += 1;
return; // not just break, but return from the function here
// if you need to break instead you need more logic here
}
}
// if you made it here you've gone through the whole loop and haven't found a match
arr.push(i);
}
至少应该可以按照您期望的方式工作。好的,希望对您有所帮助。祝你好运!