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

问题描述 投票:2回答:2

我有一组对象。许多obk = jects具有相同的密钥。如何从数组中删除除最后一个键外具有相同键的所有对象。

这是我的对象数组:

[
 {d0: "abc"},
 {d0: "xyz"},
 {d1: "abc"},
 {d3: "xyz"},
 {d3: "abc"}
]

我只希望通过键在数组中最后一次出现对象。

本质上,我正在寻找数组看起来像这样:

[
 {d0: "xyz"},
 {d1: "abc"},
 {d3: "abc"}
]

我不确定该如何处理。

javascript jquery arrays object ecmascript-6
2个回答
2
投票

如果要数组:

您可以使用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);

1
投票

您可以使用reduce函数和跟踪器来跟踪您看到的项目。像这样

© www.soinside.com 2019 - 2024. All rights reserved.