javascript 如何连接对象数组的键值?[duplicate]

83qze16e  于 2023-03-11  发布在  Java
关注(0)|答案(2)|浏览(130)

此问题在此处已有答案

(31个答案)
20小时前关门了。
我想如果散列是相同的,然后所有对象的关键属性'值'得到合并。我不想在我的代码中使用传播运算符。这里是我的输入:

[
  {
    "hash": "12345",
    "values": [1,2,3]
  },
  {
    "hash": "12345",
    "values": []
  },
  {
    "hash": "12345",
    "values": [4]
  },
  {
    "hash": "6789",
    "values": [9]
  },
  {
    "hash": "6789",
    "values": [1]
  }
]

这是我想要的输出

[
  {
    "hash": "12345",
    "values": [1,2,3,4]
  },
  {
    "hash": "12345",
    "values": [1,2,3,4]
  },
  {
    "hash": "12345",
    "values": [1,2,3,4]
  },
  {
    "hash": "6789",
    "values": [1,9]
  },
  {
    "hash": "6789",
    "values": [1,9]
  }
]
olqngx59

olqngx591#

用这个小js

const a = [
  {
    "hash": "12345",
    "values": [
      1,
      2,
      3,
      4
    ]
  },
  {
    "hash": "12345",
    "values": [
      1,
      2,
      3,
      4
    ]
  },
  {
    "hash": "12345",
    "values": [
      1,
      2,
      3,
      4
    ]
  }
];
const i = a.reduce((c,d)=>{
  c[d.hash] ??= new Set(d.values)
  d.values.forEach(da=>{
    c[d.hash].add(da)  
  })
  return c;
},{})

const result = a.map(d=>{
  if(i[d.hash]){
    d.values = [...i[d.hash]]
  }
  return d
})

console.log(result)
mzillmmw

mzillmmw2#

试试这个吧

const map = arr.reduce(
    (acc, x) =>
        acc.has(x.hash)
            ? acc.set(x.hash, acc.get(x.hash).concat(x.values))
            : acc.set(x.hash, x.values),
    new Map()
)
arr.forEach(x => x.values = map.get(x.hash).sort((a, b) => a - b))

您也可以对对象执行此操作:

const map = arr.reduce(
    (acc, x) =>
        acc[x.hash]
            ? (acc[x.hash] = acc[x.hash].concat(x.values), acc)
            : ((acc[x.hash] = x.values), acc),
    {}
)
arr.forEach(x => x.values = map[x.hash].sort((a, b) => a - b))

相关问题