簡體   English   中英

根據對象的鍵和值構造數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM