如何将并行列表的对象转换为对象列表?

时间:2016-11-22 03:13:03

标签: javascript arrays object

我有一个像

这样的对象
var data = [
   {
      "Name": ["Jane", "Peter", "Jenny"],
      "Id": [1, 2, 3],
      "Years": [16, 17, 18]
    }
];

但是我想把它放到需要其他格式的反应表

var data1 = [
  {
     "Name": "Jane",
     "Id": 1,
     "Years": 16,
   },
   {
      "Name": "Peter",
      "Id": 2,
      "Years": 17,
    },
    {
       "Name": "Jenny",
       "Id": 3,
       "Years": 18,
     }
]

如何使用JSX转换它?

2 个答案:

答案 0 :(得分:2)

我会找出最大属性长度(如果它们不完全相同),创建一个大小的数组,在for循环中迭代,使用数据键创建对象和匹配索引位置(null如果没有匹配)并将它们推入数组。

const data = [{
  "Name": ["Jane", "Peter", "Jenny"],
  "Id": [1, 2, 3],
  "Years": [16, 17, 18]
}]

const interestingData = data[0]
const keys = Object.keys(interestingData)

const maxItems = keys.reduce((count, key) => Math.max(count, interestingData[key].length), 0)

const transformed = new Array(maxItems)
for (var i = 0; i < maxItems; i++) {
  transformed[i] = keys.reduce((obj, key) => Object.assign(obj, {
    [key]: interestingData[key][i] || null // default value if no matching index
  }), Object.create(null))
}

console.info(transformed)

答案 1 :(得分:2)

这是针对您的问题的非常直接的实现。对于迭代,我考虑了对象内 Name 数组的长度。

&#13;
&#13;
var data = [{
  "Name": ["Jane", "Peter", "Jenny"],
  "Id": [1, 2, 3],
  "Years": [16, 17, 18]
}];

var data1 = [ ];

var iterations = data[0].Name.length;

var requiredData = data[0];

var keyArray = Object.keys(requiredData);


for ( var i = 0; i < iterations; i++ ) {
    tempObj = { };
    for (var key of keyArray) {
        tempObj[key] = requiredData[key][i];
    }
    data1.push(tempObj);
}

console.log('data1 = ', data1)
&#13;
&#13;
&#13;