Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/436.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何“唯一化”javascript对象数组?_Javascript_Arrays_Object_Unique - Fatal编程技术网

如何“唯一化”javascript对象数组?

如何“唯一化”javascript对象数组?,javascript,arrays,object,unique,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

如何删除数组中与所有键和值匹配的对象?我见过这个问题的各种变化,但只针对某一特定领域

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

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

这应该是对您的问题的编辑,而不是回答。这是一个回答,因为它回答了一个我认为有用的特定用例。我希望有更全面、更优雅的更好答案。