簡體   English   中英

Lodash 對對象數組中的項目進行分組

[英]Lodash to subgroup items in Array of Objects

我有一個帶有帶屬性的對象數組。 我想根據樂隊將它們分組

我試過 _groupBy 並沒有得到預期的結果

    var data=[
  {
    "tOffice": 123,
    "cType": 5000,
    "band": -4877,
    "minCh": 12,
    "maxCh": 20
  },
  {
    "tOffice": 123,
    "cType": 5000,
    "band": -4877,
    "minCh": 1,
    "maxCh": 2
  },
  {
    "tOffice": 123,
    "cType": 5000,
    "band": -4877,
    "minCh": 11,
    "maxCh": 12
  },
  {
    "tOffice": 123,
    "cType": 6000,
    "band": -5877,
    "minCh": 11,
    "maxCh": 12
  },
  {
    "tOffice": 456,
    "cType": 5000,
    "band": -4544,
    "minCh": 12,
    "maxCh": 20
  },
  {
    "tOffice": 456,
    "cType": 5000,
    "band": -4544,
    "minCh": 10,
    "maxCh": 11
  },
  {
    "tOffice": 456,
    "cType": 6000,
    "band": -5211,
    "minCh": 12,
    "maxCh": 20
  },
  {
    "tOffice": 456,
    "cType": 6000,
    "band": -5211,
    "minCh": 12,
    "maxCh": 20
  },
  {
    "tOffice": 456,
    "cType": 6000,
    "band": -5211,
    "minCh": 12,
    "maxCh": 20
  }
];

預期輸出:

var expectedResult = [{
   tOffice: 123,
   bandType: [{
         band: '123-5000',
         minMaxCharge: [{
            minCh: 12,
            maxCh: 20
         }, {
            minCh: 1,
            maxCh: 2
         }, {
            minCh: 11,
            maxCh: 12
         }]
      },
      {
         band: '123-6000',
         minMaxCharge: [{
            minCh: 11,
            maxCh: 12
         }]

      }
   ]
}, {
   tOffice: 456,
   bandType: [{
         band: '456-5000',
         minMaxCharge: [{
            minCh: 12,
            maxCh: 20
         }, {
            minCh: 10,
            maxCh: 11
         }]
      },
      {
         band: '456-6000',
         minMaxCharge: [{
            minCh: 12,
            maxCh: 20
         }, {
            minCh: 12,
            maxCh: 20
         }]
      }
   ]
}]

預期結果應包含最多 2 種組合(5000 和 6000)的 tOffice,band 是 tOffice+cType 的組合。

_.chain(data).groupBy("band").map(function(v, i) {
  return {

  }
})

我嘗試了一些 ES6 方式,發現 lodash 方法將是一個不錯的選擇,但我不知道

這是一個 vanila js 解決方案。 你可以使用reduceObject.values做這樣的事情

 var data=[{"tOffice":123,"cType":5000,"band":-4877,"minCh":12,"maxCh":20},{"tOffice":123,"cType":5000,"band":-4877,"minCh":1,"maxCh":2},{"tOffice":123,"cType":5000,"band":-4877,"minCh":11,"maxCh":12},{"tOffice":123,"cType":6000,"band":-5877,"minCh":11,"maxCh":12},{"tOffice":456,"cType":5000,"band":-4544,"minCh":12,"maxCh":20},{"tOffice":456,"cType":5000,"band":-4544,"minCh":10,"maxCh":11},{"tOffice":456,"cType":6000,"band":-5211,"minCh":12,"maxCh":20},{"tOffice":456,"cType":6000,"band":-5211,"minCh":12,"maxCh":20},{"tOffice":456,"cType":6000,"band":-5211,"minCh":12,"maxCh":20}]; const merged = data.reduce((r,{tOffice, cType, minCh, maxCh})=>{ const office = r[tOffice] = r[tOffice] || {tOffice, bandType:{}}; const band = `${tOffice}-${cType}` const nested = office.bandType[band] = office.bandType[band] || {band, minMaxCharge:[]}; nested.minMaxCharge.push({minCh, maxCh}) return r },{}) const final = Object.values(merged); final.forEach(a => a.bandType = Object.values(a.bandType)) console.log(final)

暫無
暫無

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

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