我有一组对象。许多obk = jects具有相同的密钥。如何从数组中删除除最后一个键外具有相同键的所有对象。
这是我的对象数组:
[
{d0: "abc"},
{d0: "xyz"},
{d1: "abc"},
{d3: "xyz"},
{d3: "abc"}
]
我只希望通过键在数组中最后一次出现对象。
本质上,我正在寻找数组看起来像这样:
[
{d0: "xyz"},
{d1: "abc"},
{d3: "abc"}
]
我不确定该如何处理。
您可以使用reduceRight
函数和包含Set
对象的闭包:
arr.reduceRight(((s = new Set()) =>
(acc, obj, i) => s.has((key = Object.keys(obj)[0])) ?
acc :
( s.add(key), acc.push(obj), acc )
)(), []);
let arr =[
{d0: "abc"},
{d0: "xyz"},
{d1: "abc"},
{d3: "xyz"},
{d3: "abc"}
]
let result = arr.reduceRight(((s = new Set()) =>
(acc, obj, i) => s.has((key = Object.keys(obj)[0])) ?
acc :
( s.add(key), acc.push(obj), acc )
)(), []);
console.log(result);
您可以将Object.assign
与reduce
功能结合使用
arr.reduce((acc,k) => (acc = Object.assign(acc, k)), {})
let arr =[
{d0: "abc"},
{d0: "xyz"},
{d1: "abc"},
{d3: "xyz"},
{d3: "abc"}
]
let result = arr.reduce((acc,k) => (acc = Object.assign(acc, k)), {});
console.log(result);
不过,也许更高效的方法是从列表的末尾进行迭代,如果使用reduceRight
键已经存在,则转义。>
arr.reduceRight((acc,k) => acc[Object.keys(k)[0]] ? acc : ( acc = Object.assign(acc, k) ), {});
let arr =[
{d0: "abc"},
{d0: "xyz"},
{d1: "abc"},
{d3: "xyz"},
{d3: "abc"}
]
let result = arr.reduceRight((acc,k,i) => acc[Object.keys(k)[0]] ? acc : ( acc = Object.assign(acc, k) ), {});
console.log(result);
您可以使用reduce函数和跟踪器来跟踪您看到的项目。像这样