Array.push()和唯一项

Tom*_*ski 34 javascript

我有一个简单的例子,将唯一值推送到数组中.它看起来像这样:

  this.items = [];

  add(item) {
    if(this.items.indexOf(item) > -1) {
      this.items.push(item);
      console.log(this.items);
    }
  }
Run Code Online (Sandbox Code Playgroud)

看起来挺直截了当,对吧?不,看起来如此.它不会添加任何值.我确信这是我身上某种愚蠢的错误,但我似乎无法找到它.

Jag*_*row 65

是的小错误

if(this.items.indexOf(item) === -1) {
      this.items.push(item);
      console.log(this.items);
    }
Run Code Online (Sandbox Code Playgroud)


小智 25

您可以使用ES6中的Set结构来使代码更快,更易读:

// Create Set
this.items = new Set();

add(item) {
    this.items.add(item);

    // Set to array
    console.log([...this.items]);
}
Run Code Online (Sandbox Code Playgroud)

  • 作为一个提示。如果像我一样,您在代码中使用 JSON.stringify,则添加 Sets 将导致问题而无需进一步更新。 (3认同)
  • 我喜欢这个。差点忘记了设定。我将经常使用它,尤其是在 TypeScript 中使用它。 (2认同)
  • @JohnDuskin 你能详细说明一下吗?您的评论可能会以某种方式建议在“您的代码”中使用 JSON.stringify,如在一个范围内?,还使用 ​​Set 对象,甚至像在此类范围/代码中的其他地方一样?或者更可能的是,您的意思是使用 Set 对象作为 JSON.stringify 的参数。就像在一个表达式中使用它们一样。[此处描述的问题](/sf/ask/2183361981/) 及其解决方案。 (2认同)
  • @papo 你是对的,在重新阅读我的评论时,这是一个含糊的内容。您的解释是正确的,将 Sets 添加到 JSON.stringify 命令会导致问题(根据您链接到的问题),解决方案是您需要将其转换为数组。但是,如果您要对包含集合的更高级别对象进行字符串化,这可能会更复杂,因此人们应该注意这一点。 (2认同)

lac*_*dan 13

尝试.includes()

[1, 2, 3].includes(2);     // true
[1, 2, 3].includes(4);     // false
[1, 2, 3].includes(3, 3);  // false
[1, 2, 3].includes(3, -1); // true
[1, 2, NaN].includes(NaN); // true
Run Code Online (Sandbox Code Playgroud)

所以像

const array = [1, 3];
if (!array.includes(2))
    array.push(2);
Run Code Online (Sandbox Code Playgroud)

但是,请注意页面底部的浏览器兼容性。

  • 我认为这绝对比 `.indexOf` 更优雅。我以前从来不知道有这个存在。 (2认同)

小智 12

使用

this.items = new Set();
this.items.add(1);
this.items.add(2);
this.items.add(1);
this.items.add(2);

console.log(Array.from(this.items)); // [1, 2]
Run Code Online (Sandbox Code Playgroud)


Man*_*tra 7

你的逻辑是,“如果这个项目已经存在,那就添加它。” 应该是相反的。

将其更改为...

if (this.items.indexOf(item) == -1) {
    this.items.push(item);
}
Run Code Online (Sandbox Code Playgroud)


Kit*_*Kit 7

如果您使用Lodash,请查看_.union功能:

let items = [];
items = _.union([item], items)
Run Code Online (Sandbox Code Playgroud)


Viv*_*mar 6

我想ES6已经设置了数据结构,您可以将其用于唯一条目

  • Set()是的,但是我需要一个数组。 (2认同)

小智 6

如果您正在寻找一个班轮

对于基元

(this.items.indexOf(item) === -1) && this.items.push(item);
Run Code Online (Sandbox Code Playgroud)

对于对象

this.items.findIndex((item: ItemType) => item.var === checkValue) === -1 && this.items.push(item);
Run Code Online (Sandbox Code Playgroud)

  • 你虽然缺少表达式的括号“(” (2认同)