将新对象推入数组会导致其重复

时间:2019-01-22 16:32:50

标签: typescript

我当前有一个如下数组:

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}]

这是怎么回事?

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); 
}

至少应该可以按照您期望的方式工作。好的,希望对您有所帮助。祝你好运!