JavaScript-按键减少对象数组

pro*_*h3t 4 javascript arrays javascript-objects

使用一系列对象,例如:

const arr = [
  {name: "qewregf dqewafs", value: "qewregf dqewafs answer", count: 2},
  {name: "survey with select", value: "survey with select answer", count: 2},
  {name: "werasd", value: "Donald", count: 1},
  {name: "werasd", value: "Jim", count: 1}
];
Run Code Online (Sandbox Code Playgroud)

我正在尝试减少name键的匹配值上的数组,并实现所需的输出,例如:

desiredOutput = [
  {name: "qewregf dqewafs", data: [{value: "qewregf dqewafs answer", count: 2}]},
  {name: "survey with select", data: [{value: "survey with select answer", count: 2}]},
  {name: "werasd", data: [{value: "Donald", count: 1}, {value: "Jim", count: 1}]}
]
Run Code Online (Sandbox Code Playgroud)

这种尝试减少了数组,但是我不知道如何在不覆盖的情况下合并嵌套值。

const arr = [
  {name: "qewregf dqewafs", value: "qewregf dqewafs answer", count: 2},
  {name: "survey with select", value: "survey with select answer", count: 2},
  {name: "werasd", value: "Donald", count: 1},
  {name: "werasd", value: "Jim", count: 1}
];
Run Code Online (Sandbox Code Playgroud)

我想念什么?

Sph*_*inx 6

您的代码有点接近目标,只需要进行一些调整即可。

请在下面的演示中查看评论:

  1. 如果acc.find什么都找不到,则推一个元素{name:d.name, data: [value]}

  2. 如果找到,则将其中一个推{value: ...}入data属性。

const arr = [
  {name: "qewregf dqewafs", value: "qewregf dqewafs answer", count: 2},
  {name: "survey with select", value: "survey with select answer", count: 2},
  {name: "werasd", value: "Donald", count: 1},
  {name: "werasd", value: "Jim", count: 1}
];

const result = arr.reduce((acc, d) => {
  const found = acc.find(a => a.name === d.name);
  //const value = { name: d.name, val: d.value };
  const value = { value: d.value, count: d.count }; // the element in data property
  if (!found) {
    //acc.push(...value);
    acc.push({name:d.name, data: [value]}) // not found, so need to add data property
  }
  else {
    //acc.push({ name: d.name, data: [{ value: d.value }, { count: d.count }] });
    found.data.push(value) // if found, that means data property exists, so just push new element to found.data.
  }
  return acc;
}, []);

console.log(result)
Run Code Online (Sandbox Code Playgroud)