[英]Construct array based on key & values of object
我正在嘗試創建一個代碼來接收這樣的輸入:
{
"11": {
"08/2011": 1
},
"12": {
"08/2011": 2
},
"13": {
"08/2011": 3
}
}
並且會輸出一個這樣的數組:
Excel => [
[ "" , "11" , "12" , "13" ], <- headers
[ "08/2011" , 1 , 2 , 3 ] <- first line
]
這里的目標是將輸出傳遞給node-xlsx
以創建一個 excel 電子表格。
我能夠創建一個模型:
let headers = ['', ]; let data = [headers]; let body = []; let papas = { "11": { "08/2011": 1 }, "12": { "08/2011": 2 }, "13": { "08/2011": 3 } }; for (let cnpjs in papas) { headers.push(cnpjs); } let x = {}; for (let cnpj in papas) { Object.keys(papas[cnpj]).forEach((lasanha, index) => { if (typeof x[lasanha] !== 'number') { x[lasanha] = index; data.push(body); body.push(lasanha); } else { lasanha = lasanha; } body.push(papas[cnpj][lasanha]); }); } document.body.innerHTML = JSON.stringify(data, null, 4);
問題是,輸入是這樣的:
{
"11": {
"08/2011": 1
"09/2011": 1
},
"12": {
"08/2011": 2
},
"13": {
"08/2011": 3
}
}
會搞亂邏輯,輸出如下內容:
[
[ "" , "11" , "12" , "13" ],
[ "08/2011" , 1 , "09/2011" , 1 , 2, 3 ],
[ "09/2011" , 1 , "09/2011" , 1 , 2, 3 ] ]
什么時候應該:
[
[ "" , "11" , "12" , "13" ],
[ "08/2011" , 1 , 2 , 3 ],
[ "09/2011" , 1 ]
]
任何幫助,將不勝感激。 謝謝。
更新:
不是嗎,但它更接近......當我輸入這樣的內容時:
{
"11": {
"08/2011": 1,
"09/2011": 1
},
"12": {
"08/2011": 2,
"10/2011": 1
},
"13": {
"08/2011": 3
}
}
輸出應該是:
[ [ '' , '11' , '12' , '13' ],
[ '08/2011' , 1 , 2 , 3 ],
[ '09/2011' , 1 ],
[ '10/2011' , , 1 ] ]
在這種情況下,10/2011 屬於 12
您可以使用Object.keys()
和兩個forEach()
循環來做到這一點。 注意:在第一個循環that
引用this
作為可選的thisArg
參數。
var input = { "11": { "08/2011": 1, "09/2011": 1 }, "12": { "08/2011": 2, "10/2011": 1 }, "13": { "08/2011": 3 } } var result = []; Object.keys(input).forEach(function(k, i) { (i == 0) ? result.push(['', k]): result[0].push(k); var that = this; Object.keys(input[k]).forEach(function(e) { if (!that[e]) { that[e] = [e]; result.push(that[e]); } that[e][i + 1] = input[k][e]; }) }, {}) console.log(result)
嘗試這個:
// It was hard to write, it should be hard to understand. const transform = input => [ ['', ...Object.keys(input)] ,...[].concat(...Object.values(input).map(Object.keys)) .filter((x, i, arr) => arr.indexOf(x) === i) .map(first => [first, ...Object.values(input).map(x => Object.entries(x).find(([key, value]) => key === first)).map(x => x && x[1])])] console.log(transform({ "11": { "08/2011": 1, "09/2011": 1 }, "12": { "08/2011": 2, "10/2011": 1 }, "13": { "08/2011": 3 } }))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.