简体   繁体   English

将对象数组转换为单个对象

[英]Convert array of objects into a single object

I have the following array for example -例如,我有以下数组 -

[
  {
    name: "abc",
    value: "1"
  },
  {
    name: "xyz",
    value: "2"
  },
  {
    name: "abc",
    value: "3"
  },
  {
    name: "abc",
    value: "4"
  },
  {
    name: "xyz",
    value: "5"
  },
]

Now, I want to reduce this array into a single object by grouping value with the same name together into an array.现在,我想通过将具有相同namevalue组合到一个数组中来将此数组简化为一个对象。 Something like this -像这样的东西-

{
  abc: [1, 3, 4],
  xyz: [2, 5]
}

How do I do this using reduce in JavaScript?如何在 JavaScript 中使用reduce

I'm not sure if this the right approach but I have tried something like this and it doesn't give me the desired output.我不确定这是否是正确的方法,但我已经尝试过类似的方法,但它并没有给我想要的输出。

const data = arr.reduce((acc, item) => {
  return {
    ...acc,
    [item.name]: [item.value, acc[item.value]]
  };
});

You were on the right track with your answer, but you need to check if acc already has a key of item.name :你的答案是正确的,但你需要检查acc是否已经有item.name的键:

 const data = [{ name: "abc", value: "1" }, { name: "xyz", value: "2" }, { name: "abc", value: "3" }, { name: "abc", value: "4" }, { name: "xyz", value: "5" }, ] const result = data.reduce((acc, { name, value }) => ({ ...acc, [name] : [...(acc[name] || []), value] }), {}) console.log(result)

Note you can use object destructuring to simplify the accumulation code.请注意,您可以使用对象解构来简化累积代码。

 const data=[ { name: "abc", value: "1" }, { name: "xyz", value: "2" }, { name: "abc", value: "3" }, { name: "abc", value: "4" }, { name: "xyz", value: "5" }, ]; const res=data.reduce((a,c)=>{ (a[c.name]??=[]).push(c.value); return a; },{}); console.log(res);

 const data = [{ name: "abc", value: "1" }, { name: "xyz", value: "2" }, { name: "abc", value: "3" }, { name: "abc", value: "4" }, { name: "xyz", value: "5" }, ]; let finalObject = {}; data.forEach((item) => { if (!finalObject.hasOwnProperty(item.name)) { finalObject[item.name] = [item.value]; } else { finalObject[item.name].push(item.value); } }); console.log(finalObject);

Just parse values if you need in string to number and it will give you answer如果您需要将字符串解析为数字,只需解析值,它会给您答案

{
  abc: [1, 3, 4],
  xyz: [2, 5]
}

You can group the array using Array.prototype.reduce .您可以使用Array.prototype.reduce对数组进行分组。

 const data = [ { name: "abc", value: "1" }, { name: "xyz", value: "2" }, { name: "abc", value: "3" }, { name: "abc", value: "4" }, { name: "xyz", value: "5" }, ], result = data.reduce((r, o) => ((r[o.name] ??= []).push(o.value), r), {}); console.log(result);

reduce takes some time to getting used to, but it's fairly simple once it clicks. reduce需要一些时间来适应,但是一旦点击它就相当简单了。 You can also group the array using a simple for...of loop.您还可以使用简单for...of循环对数组进行分组。

 const data = [ { name: "abc", value: "1" }, { name: "xyz", value: "2" }, { name: "abc", value: "3" }, { name: "abc", value: "4" }, { name: "xyz", value: "5" }, ]; const result = {}; for (let d of data) { (result[d.name] ??= []).push(d.value); } console.log(result);

Other relevant documentations:其他相关文件:

Use reduce() :使用reduce()

 const arr = [ { name: "abc", value: "1" }, { name: "xyz", value: "2" }, { name: "abc", value: "3" }, { name: "abc", value: "4" }, { name: "xyz", value: "5" }, ] const data = arr.reduce((a,c) => ({...a, [c.name]: a[c.name] ? [...a[c.name], c.value] : [c.value]}),{}) console.log(data)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM