首页 > 解决方案 > 通过对另一个对象数组进行排序来创建对象数组

问题描述

我想创建一个对象数组,每个数据对象的第一个元素是一个单独的对象,每个数据对象的第二个元素是另一个单独的对象,依此类推......

let array = [{   
    data: {
       center1: "1",
       storage1: "1",
       system1: "1",
    }
  },
  {  
    data: {
       center2: "2",
       storage2: "2",
       system2: "2",
    }
  }
]

预期结果:

[
    { center1: "1",  center2: "2"},
    { storage1: "1",  storage2: "2"},
    { system1: "1",  system2: "2"}
]

这就是我试图做的,但效果不佳:)

 const rows = [];
 array.forEach((item, index) => {
      for (let key in item.data) {
          rows.push({index : key + ': ' + item.data[key]});
      }
 });

输出是这样的:

[
    {index : 'center1: 1'},
    {index : 'storage1: 1'},
    {index : 'system1: 1'},
    {index : 'center2: 2'},
    {index : 'storage2: 2'},
    {index : 'system2: 2'}
]

谢谢您的帮助!

标签: javascript

解决方案


这将是非常脆弱的,因为键顺序与 JS 对象的工作方式无关,并且“每个对象中的第一个键是同一种键”的假设实际上只是一个假设。因此,首先要解决的问题是让所有这些对象使用相同的键,而不是唯一键,从而使“键排序”变得无关紧要。

但是,如果这不是一个选项(几乎可以肯定,但如果不是),那么Object.entries会将任何对象转换为键/值数组,然后您可以使用它来重构此数据:

let array = [{   
    data: {
       center1: "1",
       storage1: "1",
       system1: "1",
    }
  },
  {  
    data: {
       center2: "2",
       storage2: "2",
       system2: "2",
    }
  }
]

const restructured = array.reduce((result, e) => {
  Object.entries(e.data).forEach(([key, val], pos) => {
    if (!result[pos]) result[pos] = {};
    result[pos][key] = val;
  });
  return result;
}, []);

console.log(restructured);


推荐阅读