【问题标题】:How to remove duplicates from a typescript array? [duplicate]如何从打字稿数组中删除重复项? [复制]
【发布时间】:2017-12-15 21:26:59
【问题描述】:

能否告诉我如何在类型脚本中从数组中删除重复项。

我的数组看起来像

a = [{a: 1, b: 2}, {a: 1, b: 2}, {c: 3, d: 4}]

我正在寻找

a = [{a: 1, b: 2}, {c: 3, d: 4}]

我使用了如下设置数据结构

a = Array.from(new Set(a))

但仍然没有用。请告诉我如何使用单个语句从数组中删除重复项?

【问题讨论】:

  • 不是一个真正的打字稿问题,这是一个更一般的 javasript 问题。而且,已经有plenty of answers了。
  • 不是 TypeScript,不是 Angular....
  • 你的代码不过滤元素的原因是因为两个相似的对象仍然被认为是不同的对象,因为它们指向不同的对象。您需要编写自己的代码来使用自定义比较器。您可以使用下划线,或将其用作代码的灵感underscorejs.org/#uniq
  • 提示{foo:3} !== {foo:3}
  • @JaredSmith 我不是已经说过了吗?

标签: javascript arrays


【解决方案1】:

不在单个语句中,但很短。

var a = [{a: 1, b: 2}, {a: 1, b: 2}, {c: 3, d: 4}];
a = a.filter((value, index, array) => 
     !array.filter((v, i) => JSON.stringify(value) == JSON.stringify(v) && i < index).length);

console.log(a);
您的问题如下所示:

Delete duplicated elements in array of objects Javascript

但就像评论中的一样会失败:

var a = [{a: 1, b: 2}, {b: 2, a: 1}]; 

您需要针对您的案例进行自定义比较:

function isEqual(a, b){
  for(var i in a)
       if(a[i] != b[i])
          return false;
  for(var i in b)
       if(b[i] != a[i])
          return false;
  return true;
}

var a = [{a: 1, b: 2}, {b: 2, a: 1}, {c: 3, d: 4}];
a = a.filter((value, index, array) => 
     !array.filter((v, i) => isEqual(value, v) && i < index).length);

console.log(a);

您可以比较 id 或类似的东西来识别此示例中的相等对象我只是比较属性。

就像@Juan Mendes 在评论中所说:

您的代码不过滤元素的原因是因为两个相似的对象仍然被视为不同的对象,因为它们指向不同的对象。您需要编写自己的代码来使用自定义比较器。

【讨论】:

  • 没有解释问题所在的答案没有那么有用
  • 如果您的数组如下,则此代码将失败:var a = [{a: 1, b: 2}, {b: 2, a: 1}]; 因为JSON.stringify 将为上面的两个相似对象创建不同的字符串。
  • 你说得对,我会用一个更完整的例子来编辑
  • 谢谢,我会在未来尝试创造更好的答案
  • 完美运行!谢谢。
猜你喜欢
  • 2020-11-29
  • 2021-09-01
  • 2017-06-21
  • 1970-01-01
  • 2022-06-10
  • 1970-01-01
  • 2012-10-04
  • 2014-06-07
相关资源
最近更新 更多