根据对象的关键字和值构造数组
我试图创build一个代码,将接收像这样的input:
{ "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
以创build一个excel电子表格。
我能够创build一个模型:
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);
问题是,像这样的input:
{ "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 ] ]
任何帮助,将不胜感激。 谢谢。
更新:
是不是,但它更接近…当我有这样的input:
{ "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()
两个循环来完成。 注意:在第一个循环thisArg
为可选的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 } }))