【问题标题】:JavaScript - Flatten Array of Nested ObjectsJavaScript - 扁平化嵌套对象数组
【发布时间】:2026-02-19 04:05:01
【问题描述】:

我正在处理一个对象数组,需要使用对象值作为新对象键,将数据集展平并重新分配到单个对象数组中。

传入数据:

results = [
  {
    surveyValues: [
      { id: 135, name: 'First Name', value: 'Jim' },
      { id: 136, name: 'Last Name', value: 'Jones' },
      { id: 137, name: 'City', value: 'Fredsburg' },
    ],
  },
  {
    surveyValues: [
      { id: 135, name: 'First Name', value: 'Greg' },
      { id: 136, name: 'Last Name', value: 'Jones' },
      { id: 137, name: 'City', value: 'Waverly' },
    ],
  },
];

期望的结果:

output = [
  {
    id: 1, FirstName: 'Jim', LastName: 'Jones', City: 'Fredsburg',
  },
  {
    id: 2, FirstName: 'Greg', LastName: 'Jones', City: 'Waverly',
  },
];

我当前的尝试让我以正确的顺序放置更新的键/值对,但会创建一个庞大的单个对象数组。

当前代码:

const results = [];

surveyResults.map(s => s.surveyValues)
  .forEach(s => Object.entries(s)
  .forEach(([key, value]) => {
    Object.entries(value)
      .forEach(([k, v]) => {
        if (k === 'name') {
          results.push({
            id: value.id,
            [v]: value.value.toString(),
          });
        }
    });
}));

当前代码输出:

[
  {
    id: 135, FirstName: 'Jim',
  },
  {
    id: 136, LastName: 'Jones',
  },
  {
    id: 137, City: 'Fredsburg',
  },
  {
    id: 135, FirstName: 'Greg',
  },
  {
    id: 136, LastName: 'Jones',
  },
  {
    id: 137, City: 'Waverly',
  },
]

我遗漏了什么,为什么我的代码没有按照需要创建新的对象数组?

【问题讨论】:

    标签: javascript object


    【解决方案1】:

    您可以使用mapreduce 来完成此操作。我还在 map 函数的回调中访问索引 i 以设置 id 属性和 string.replace() 以从 FirstNameLastName 键中剥离空间。

    const results = [
      {
        surveyValues: [
          { id: 135, name: 'First Name', value: 'Jim' },
          { id: 136, name: 'Last Name', value: 'Jones' },
          { id: 137, name: 'City', value: 'Fredsburg' },
        ],
      },
      {
        surveyValues: [
          { id: 135, name: 'First Name', value: 'Greg' },
          { id: 136, name: 'Last Name', value: 'Jones' },
          { id: 137, name: 'City', value: 'Waverly' },
        ],
      },
    ];
    
    
    const result = results.map((e, i) => 
      e.surveyValues.reduce((a, e) => {
        a[e.name.replace(" ", "")] = e.value;
        return a;
      }, {id: i + 1})
    );
    
    console.log(result);

    【讨论】:

      【解决方案2】:

      在外部map() 循环中创建每个对象,并在内部forEach() 中为其添加属性。

      surveyResults = [
        {
          surveyValues: [
            { id: 135, name: 'First Name', value: 'Jim' },
            { id: 136, name: 'Last Name', value: 'Jones' },
            { id: 137, name: 'City', value: 'Fredsburg' },
          ],
        },
        {
          surveyValues: [
            { id: 135, name: 'First Name', value: 'Greg' },
            { id: 136, name: 'Last Name', value: 'Jones' },
            { id: 137, name: 'City', value: 'Waverly' },
          ],
        },
      ];
      
      const results = surveyResults.map((s, i) => {
        let v = s.surveyValues;
        let obj = {id: i};
        v.forEach(item => obj[item.name.replace(/\s+/g, "")] = item.value.toString());
        return obj;
      });
      
      console.log(results);

      【讨论】: