首页 > 解决方案 > 从对象数组中删除除最后一个相似键之外的所有键

问题描述

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

这是我的对象数组:

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

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

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

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

我不知道该怎么做。

标签: javascriptjqueryarraysobjectecmascript-6

解决方案


如果你想要一个数组:

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


推荐阅读