根据对象的关键字和值构造数组

我试图创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 } }))