2016-11-22 67 views
0

我有喜欢如何将平行列表的对象转换为对象列表?

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转换呢?

+5

你可能会写一些代码。你有什么尝试? – RobG

+0

如果'Name','Id'和'Years'中的数组没有相同数量的项目,会发生什么? – Phil

+0

@Phil我认为这不会发生,它会让'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)

2

这里是你的问题非常简单的实现。对于迭代,我已经考虑了名称数组内部对象的长度。

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)

相关问题