簡體   English   中英

JavaScript 使用 Lodash 通過一個或兩個鍵對對象數組進行分組和變換

[英]JavaScript group and transform array of objects by one or two keys using Lodash

如何按Date分組並轉換以下數據

// PROVIDED INPUT
[
  {
    "Date": "2021/Dec/01",
    "Media category": "Canvas",
    "Printed square meters": 244.58
  },
  {
    "Date": "2021/Dec/01",
    "Media category": "Film",
    "Printed square meters": 152.62
  },
  {
    "Date": "2021/Dec/01",
    "Media category": "Heavy paper > 200gsm",
    "Printed square meters": 256.02000000000004
  },
  {
    "Date": "2021/Dec/02",
    "Media category": "Textile",
    "Printed square meters": 144.95999999999998
  },
  {
    "Date": "2021/Dec/02",
    "Media category": "Thick film > 200 um",
    "Printed square meters": 153.37
  },
  {
    "Date": "2021/Dec/02",
    "Media category": "Paper",
    "Printed square meters": 217.2
  }, ...
]

用 JavaScript 進入這個。 我試圖用 Lodash 的groupBy()mergeWith()來完成這個,但我沒有得到任何地方:

// DESIRED OUTPUT
[
  {
    "Date": "2021/Dec/01",
    "Canvas": 244.58,
    "Film": 152.62
    "Heavy paper > 200gsm": 256.02000000000004
  },
  {
    "Date": "2021/Dec/02",
    "Textile": 144.95999999999998,
    "Thick film > 200 um": 153.37
    "Paper": 217.2
  }, ...
]

此外,是否可以按兩個鍵分組 - 即DatePrinter id

// PROVIDED INPUT
[
  {
    "Date": "2021/Dec/01",
    "Printer id": "700",
    "Media category": "Canvas",
    "Printed square meters": 244.58
  },
  {
    "Date": "2021/Dec/01",
    "Printer id": "700",
    "Media category": "Film",
    "Printed square meters": 152.62
  },
  {
    "Date": "2021/Dec/01",
    "Printer id": "701",
    "Media category": "Heavy paper > 200gsm",
    "Printed square meters": 256.02000000000004
  },
  {
    "Date": "2021/Dec/01",
    "Printer id": "701",
    "Media category": "Textile",
    "Printed square meters": 144.95999999999998
  }, ...
]
// DESIRED OUTPUT
[
  {
    "Date": "2021/Dec/01",
    "Printer id": "700",
    "Canvas": 244.58,
    "Film": 152.62
  },
  {
    "Date": "2021/Dec/01",
    "Printer id": "701",
    "Heavy paper > 200gsm": 256.02000000000004,
    "Textile": 144.95999999999998
  }, ...

我嘗試用這段代碼做第一個,但不知道如何轉換字段:

// What I tried doing
console.log(_(data)
    .groupBy('Date')
    .map(g => _.mergeWith({}, ...g, (obj, src) =>
      _.isArray(obj) ? obj.concat(src) : undefined))
    .value());

在提交此之前檢查了許多問題,但沒有一個具有字段轉換。

您可以基於此鍵在DatePrinter id和組上創建計算鍵。

 const data = [ { "Date": "2021/Dec/01", "Printer id": "700", "Media category": "Canvas", "Printed square meters": 244.58 }, { "Date": "2021/Dec/01", "Printer id": "700", "Media category": "Film", "Printed square meters": 152.62 }, { "Date": "2021/Dec/01", "Printer id": "701", "Media category": "Heavy paper > 200gsm", "Printed square meters": 256.02000000000004 }, { "Date": "2021/Dec/01", "Printer id": "701", "Media category": "Textile", "Printed square meters": 144.95999999999998 }], result = Object.values(data.reduce((r, o) => { let key = o.Date + '-' + o['Printer id']; r[key]??= {Date: o.Date, 'Printer id': o['Printer id']}; r[key][o['Media category']] = (r[key][o['Media category']]?? 0) + o['Printed square meters']; return r; },{})); console.log(result);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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