javascript - 如何获取 "uniqueify"一个 JavaScript 对象数组?

标签 javascript arrays object unique

如何删除数组中所有键和值都匹配的对象?我见过这个问题的各种变体,但仅限于特定领域。

例如,给定以下输入,输出将如下所示:

> var a = [
  {a:1, b:'x'},
  {a:1, b:'y'},
  {a:1, b:'y'},
  {a:2, b:'x'},
  {a:2, b:'y'},
  {a:2, b:'y'},
  {a:2, b:'x'},
  {b:'y', a:2},
  {a:2, b:'y', c:'surprise!'}
]
> blackbox(a)
[
  {a:1, b:'x'},
  {a:1, b:'y'},
  {a:2, b:'x'},
  {a:2, b:'y'},
  {a:2, b:'y', c:'surprise!'}
]

理想情况下,blackbox 不使用按键进行硬编码。

最佳答案

顺便说一句,这是我现在拥有的技巧。它将每个(已排序的)对象转换为一个字符串,并检查之前是否见过该字符串。

无论如何,一定有一个更优雅的解决方案!

> function uniq(a) {
  var keys = new Set();
  return a.filter(function(row) {
    var key  = Object.entries(row).sort().toString();
    var uniq = !keys.has(key);
    keys.add(key);
    return uniq;
  });
}
> a =
[ { a: 1, b: 'x' },
  { a: 1, b: 'y' },
  { a: 1, b: 'y' },
  { a: 2, b: 'x' },
  { a: 2, b: 'y' },
  { a: 2, b: 'y' },
  { a: 2, b: 'x' },
  { b: 'y', a: 2 },
  { a: 2, b: 'y', c: 'surprise!' },
  { c: 'surprise!', a: 2, b: 'y' } ]
> uniq(a)
[ { a: 1, b: 'x' },
  { a: 1, b: 'y' },
  { a: 2, b: 'x' },
  { a: 2, b: 'y' },
  { a: 2, b: 'y', c: 'surprise!' } ]
> b =
[ { a: { b: 1, c: 2 }, b: 1 },
  { b: 1, a: { c: 2, b: 1 } },
  { a: { b: 1, c: 2 }, b: 2 } ]
> uniq(b) // works because nested objects happen to be identical
[ { a: { b: 1, c: 2 }, b: 1 }, { a: { b: 1, c: 2 }, b: 2 } ] 
> c = 
[ { a: { b: 1, c: 2 }, b: 1 },
  { b: 1, a: { c: 2, b: 1 } },
  { a: { b: 1, c: 2 }, b: 2 },
  { a: { b: 2, c: 1 }, b: 2 } ]
> uniq(c) // fail on nested object
[ { a: { b: 1, c: 2 }, b: 1 }, { a: { b: 1, c: 2 }, b: 2 } ]

关于javascript - 如何获取 "uniqueify"一个 JavaScript 对象数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51004465/

相关文章:

javascript - 如何检查数组值是否具有文件格式

javascript - 有没有一种简单/快速的方法可以将 "data-"属性映射到大小写混合的属性名称?

javascript - 如何使用文件上传对话框选择的绝对文件路径的值填充 <input type ="text">?

java - 按字母顺序从数组中插入排序字符串

c# - 为什么有必要对 'manually' 求值或强制转换对象的类型?

java - 如果 hashCode() 没有被覆盖,对象的哈希码是什么?

javascript - 将对象传递给指令不允许全局变量

javascript - 无法在 Javascript 中访问我的二维数组

python - 将 Numpy 数组索引存储在变量中

javascript - 什么时候在 JavaScript 中创建对象/实例?