如何将值数组作为键分配给另一个值数组?
问题描述:
什么是转换的最佳方式,如何将值数组作为键分配给另一个值数组?
{
"columns":[
"name",
"color"
],
"values":[
[
"lion",
"yellow"
],
[
"crow",
"black"
]
]
}
到
{
"data":[
{
"name":"lion",
"color":"yellow"
},
{
"name":"crow",
"color":"black"
}
]
}
而不是循环,有没有什么功能可用?我可以通过类似extend()的方法实现吗?
答
你可以使用Object.assign
与spread syntax ...
的部分。
var object = { columns: ["name", "color"], values: [["lion", "yellow"], ["crow", "black"]] },
result = { data: object.values.map(v => Object.assign(...object.columns.map((c, i) => ({[c]: v[i]})))) };
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
答
您可以使用map和reduce的组合来做到这一点。减少原始列阵列将允许代码任意列数的工作,它将被指数回升相应的值:
const result = {data: data.values.map(el => {
return data.columns.reduce((prev, curr, index) => {
prev[curr] = el[index]
return prev
}, {})
})}
检查下面的演示。
const data = {
"columns":[
"name",
"color"
],
"values":[
[
"lion",
"yellow"
],
[
"crow",
"black"
]
]
}
const result = {data: data.values.map(el => {
return data.columns.reduce((prev, curr, index) => {
prev[curr] = el[index]
return prev
}, {})
})}
console.log(result)
答
你可以用解构赋值.columns
阵列的瓦莱斯,传播元素; for..of
循环通过遍历原始对象的属性.values
分配.columns
阵列字符串作为在data
阵列对象的属性的计算性能,分配的每个阵列的值作为创建的对象的值
let obj = {
"columns":[
"name",
"color"
],
"values":[
[
"lion",
"yellow"
],
[
"crow",
"black"
]
]
}
let [res, key, value] = [{data:Array()}, ...obj.columns];
for (let [a, b] of [...obj.values]) res.data.push({[key]:a, [value]:b});
console.log(res);