2017-04-13 71 views
3

什麼是轉換的最佳方式,如何將值數組作爲鍵分配給另一個值數組?

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

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

而不是循環,有沒有什麼功能可用?我可以通過類似extend()的方法實現嗎?

回答

4

你可以使用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; }

2

您可以使用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)

2

你可以用解構賦值.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);

相關問題