我有以下输入数据:
{
'a': [1, 2, 3],
'b': ['x', 'y', 'z'],
'c': ['a', 'b', 'c'],
}
我正在尝试将以上输入数据更改为以下数据结构:
{
'0': { a: 1, b: 'x', c: 'a' },
'1': { a: 2, b: 'y', c: 'b' },
'2': { a: 3, b: 'z', c: 'c' }
}
我的Javascript代码是:
let parentDataset = {
'a': [1, 2, 3],
'b': ['x', 'y', 'z'],
'c': ['a', 'b', 'c'],
}
let children = {};
let parent = {};
for (let key in parentDataset) {
let i = 0;
for (let value of parentDataset[key]) {
children[key] = value;
parent[i] = children;
i++;
}
}
console.log('parent', parent);
但我得到的是输出,其中最后一个值超过了写下前两个值,如下所示:
{
'0': { a: 3, b: 'z', c: 'c' },
'1': { a: 3, b: 'z', c: 'c' },
'2': { a: 3, b: 'z', c: 'c' }
}
非常感谢任何解决方案和解释!
答案 0 :(得分:4)
获取密钥列表后,您可以Array#reduce将一个阵列添加到一系列对象中,并使用Array#forEach和Object#assign填充它们:
const obj = {
'a': [1, 2, 3],
'b': ['x', 'y', 'z'],
'c': ['a', 'b', 'c'],
};
const keys = Object.keys(obj);
const result = obj[keys[0]].reduce((r, _, i) => {
const o = r[i] = {};
keys.forEach((key) => Object.assign(o, { [key]: obj[key][i] }));
return r;
}, {});
console.log(result);
这是您的代码的工作版本:
const parentDataset = {
'a': [1, 2, 3],
'b': ['x', 'y', 'z'],
'c': ['a', 'b', 'c'],
}
const parent = {};
for (const key in parentDataset) {
let i = 0;
for (const value of parentDataset[key]) {
!parent[i] && (parent[i] = {}); // create a new object if one is needed
parent[i][key] = value; // add the key and value to the object
i++;
}
}
console.log('parent', parent);
答案 1 :(得分:1)
const input = {
'a': [1, 2, 3],
'b': ['x', 'y', 'z'],
'c': ['a', 'b', 'c']
};
const output = {};
Object.keys(input).forEach( key => {
input[key].forEach((value,i) => {
if( !output[i] ){
output[i] = { [key] : value };
} else {
output[i][key] = value;
}
});
});
答案 2 :(得分:1)
另一种解决方案是减少对象的值。例如:
const data = {
'a': [1, 2, 3],
'b': ['x', 'y', 'z'],
'c': ['a', 'b', 'c'],
}
const result = Object.values(data).reduce((acc, subarr, idx, arr) => {
return { ...acc, [idx]: arr.map(sub => sub[idx]) }
}, {})
答案 3 :(得分:1)
要实现此目的,您必须遍历给定的对象键和值。
以下是小代码段:
var data = {
'a': [1, 2, 3],
'b': ['x', 'y', 'z'],
'c': ['a', 'b', 'c'],
};
function addKeys(keys, values, index) {
var subObj = {}
for (var i = 0; i < keys.length; i++) {
subObj[keys[i]] = values[i][index]
}
return subObj
}
function returnFinalObject(data) {
var keys = Object.keys(data)
var values = Object.values(data)
var obj = {}
for (var i = 0; i < keys.length; i++) {
obj[i] = addKeys(keys, values, i)
}
return (obj)
}
var finalObj = returnFinalObject(data)
console.log(finalObj)
希望这有帮助
答案 4 :(得分:1)
var o = {
'a': [1, 2, 3],
'b': ['x', 'y', 'z'],
'c': ['a', 'b', 'c'],
};
var transposed = Object.keys(o).reduce((res, key, i, arr) => {
res[i] = arr.reduce((row, key) => {
row[key] = o[key][i];
return row;
}, {});
return res;
}, {});
console.log(transposed);
&#13;