如何删除数组中所有键和值都匹配的对象?我见过这个问题的各种变体,但仅限于特定领域。
例如,给定以下输入,输出将如下所示:
> 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/