【问题标题】:Remove all but last similar key from array of objects从对象数组中删除除最后一个相似键之外的所有键
【发布时间】:2020-06-06 01:45:08
【问题描述】:

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

这是我的对象数组:

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

我只想要数组中最后一次出现的对象。

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

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

我不知道该怎么做。

【问题讨论】:

  • 翻转它:当向后迭代时保持first。 (这也可以通过简单的反向、优先获取、反向来完成:不缺少如何查找/获取第一个值。通常用字典简单地实现。在这种特定情况下,可能还需要 Object.keys()[0]获取第一个/唯一的键值。)
  • @user2864740,感谢您的回复。但我不确定你所说的翻转是什么意思

标签: javascript jquery arrays object ecmascript-6


【解决方案1】:

如果你想要一个数组:

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

【讨论】:

  • 感谢您的回复。但是如何在数组中创建这些对象?这只是形成一个数组。可以是:[{},{},{}]
  • @nb_nb_nb 哦,我明白了。当然给我一点时间
【解决方案2】:

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

【讨论】:

  • 可以在不使用reduce的情况下“完全一样”完成,因为该方法依赖于副作用。
猜你喜欢
  • 2021-10-25
  • 2021-12-31
  • 2016-08-03
  • 2017-11-05
  • 1970-01-01
  • 2022-07-27
  • 2020-05-13
  • 1970-01-01
相关资源
最近更新 更多