从对象数组中删除除最后一个相似键之外的所有键



我有一个对象数组。许多 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.assignreduce函数结合使用

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函数和跟踪器来跟踪您看到的项目。 像这样

const arr = [{
d0: "abc"
},
{
d0: "xyz"
},
{
d1: "abc"
},
{
d3: "xyz"
},
{
d3: "abc"
}
]
const tracker = {}
result = arr.reduce((acc, cur) => {
const key = Object.keys(cur)[0];
if (tracker[key]) {
tracker[key][key] = cur[key]
} else {
acc.push(cur);
tracker[key] = cur;
}
return acc;
}, []);
console.log(result)

相关内容

最新更新