我有一个对象数组。许多 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函数和跟踪器来跟踪您看到的项目。 像这样
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)