如何将值数组作为键分配给另一个值数组?

问题描述:

什么是转换的最佳方式,如何将值数组作为键分配给另一个值数组?

{ 
    "columns":[ 
     "name", 
     "color" 
    ], 
    "values":[ 
     [ 
     "lion", 
     "yellow" 
     ], 
     [ 
     "crow", 
     "black" 
     ] 
    ] 
} 

{ 
    "data":[ 
     { 
     "name":"lion", 
     "color":"yellow" 
     }, 
     { 
     "name":"crow", 
     "color":"black" 
     } 
    ] 
} 

而不是循环,有没有什么功能可用?我可以通过类似extend()的方法实现吗?

你可以使用Object.assignspread 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);