如何在 JavaScript 中旋转对象数组?

Emi*_*nov 2 javascript arrays

我有一个对象数组,需要将其转换为表格(类似于数据透视)。这么说,我需要获取另一个具有唯一标题的对象数组,其中包含带有值对的嵌套对象数组。您能看一下这个并帮助实现我所需要的吗?请查看下面的原始数组和所需的数组:

原始数组:

[
{title: "Title1", value1: "value1", value2: "value2"},
{title: "Title2", value1: "value1", value2: "value2"},
{title: "Title1", value1: "value1", value2: "value2"},
{title: "Title3", value1: "value1", value2: "value2"},
{title: "Title2", value1: "value1", value2: "value2"},
{title: "Title1", value1: "value1", value2: "value2"},
{title: "Title3", value1: "value1", value2: "value2"},
{title: "Title1", value1: "value1", value2: "value2"},
]
Run Code Online (Sandbox Code Playgroud)

期望的结果:

[
{title: "Title1", values: [{value1: "value1"}, {value2: "value2"}]},
{title: "Title2", values: [{value1: "value1"}, {value2: "value2"}]},
{title: "Title3", values: [{value1: "value1"}, {value2: "value2"}]},
]
Run Code Online (Sandbox Code Playgroud)

感谢您提前提供任何建议。

ste*_*425 5

一个简单的数组缩减可能会有所帮助

let data = [{
  title: "Title1",
  value1: "value1",
  value2: "value2"
}, {
  title: "Title2",
  value1: "value1",
  value2: "value2"
}, {
  title: "Title1",
  value1: "value1",
  value2: "value2"
}, {
  title: "Title3",
  value1: "value1",
  value2: "value2"
}, {
  title: "Title2",
  value1: "value1",
  value2: "value2"
}, {
  title: "Title1",
  value1: "value1",
  value2: "value2"
}, {
  title: "Title3",
  value1: "value1",
  value2: "value2"
}, {
  title: "Title1",
  value1: "value1",
  value2: "value2"
}];

let pivoted = data.reduce((prev, cur) => {
  let existing = prev.find(x => x.title === cur.title);

  if (existing)
    existing.values.push(cur)
  else
    prev.push({
      title: cur.title,
      values: [cur]
    });

  return prev;
}, []);

console.log(pivoted);
Run Code Online (Sandbox Code Playgroud)

使用的API

减少

寻找

然后可以根据您想要的任何字段进行调整,但是如果该字段不存在,则需要添加错误处理:

let pivotBy = (key, data) => data.reduce((prev, cur) => {
  let existing = prev.find(x => x[key] === cur[key]);

  if (existing) {
    existing.values.push(cur);
  } else {
    let toInsert = {
        values: [cur]
    }

    toInsert[key] = cur[key];

    prev.push(toInsert);
  }

  return prev;
}, []);
Run Code Online (Sandbox Code Playgroud)

编辑 我误解了您想要的输出格式,但是可以修改减少方法来满足该要求。