如何“唯一化”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 } ]
这应该是对您的问题的编辑,而不是回答。这是一个回答,因为它回答了一个我认为有用的特定用例。我希望有更全面、更优雅的更好答案。