簡體   English   中英

GroupBy 對象數組 JavaScript

[英]GroupBy Object Array JavaScript

我有一個輸入:

var modbusData = [
  { Type: "rtu", IdDevice: "1", Time: "11:01:00", Data: "1,12,23" },
  { Type: "tcp", IdDevice: "2", Time: "11:01:11", Data: "30,40,50" },
  { Type: "rtu", IdDevice: "1", Time: "11:02:00", Data: "5,10,21" },
  { Type: "tcp", IdDevice: "2", Time: "11:02:11", Data: "32,44,53" },
];

我打電話后:

function groupBy(objectArray, property) {
  return objectArray.reduce(function (acc, obj) {
    let key = obj[property]
    if (!acc[key]) {
      acc[key] = []
    }
    acc[key].push(obj)
    return acc
  }, {})
}
let groupedData = groupBy(modbusData, 'Type')
console.log(groupedData)

結果將是:

{
  rtu: [
    { Type: 'rtu', IdDevice: '1', Time: '11:01:00', Data: '1,12,23' },
    { Type: 'rtu', IdDevice: '1', Time: '11:02:00', Data: '5,10,21' }
  ],
  tcp: [
    { Type: 'tcp', IdDevice: '2', Time: '11:01:11', Data: '30,40,50' },
    { Type: 'tcp', IdDevice: '2', Time: '11:02:11', Data: '32,44,53' }
  ]
}

現在我想要當modbusData 中沒有 "Type" : "rtu" 或 "tcp" 時,結果將返回一個空數組,如下所示:

{
  rtu: [
    { Type: 'rtu', IdDevice: '1', Time: '11:01:00', Data: '1,12,23' },
    { Type: 'rtu', IdDevice: '1', Time: '11:02:00', Data: '5,10,21' }
  ],
  tcp: []
}

嘗試使用擴展運算alltypes並所有alltypes

let alltypes = { rtu: [], tcp: [] }
let result = {...alltypes, ...groupedData}

 var modbusData = [ { Type: "rtu", IdDevice: "1", Time: "11:01:00", Data: "1,12,23" }, { Type: "rtu", IdDevice: "1", Time: "11:02:00", Data: "5,10,21" }, ]; function groupBy(objectArray, property) { return objectArray.reduce(function (acc, obj) { let key = obj[property] if (!acc[key]) { acc[key] = [] } acc[key].push(obj) return acc }, {}) } let groupedData = groupBy(modbusData, 'Type') let alltypes = { rtu: [], tcp: [] } let result = {...alltypes, ...groupedData} console.log(result)

您需要將預期的組鍵作為減速器的初級對象傳遞。

>>> [ 'rtu', 'tcp' ]
<<< Object.fromEntries(expectedGroups.map(k => [k, []])) // { rtu: [], tcp: [] }

 var modbusData = [ { Type: "rtu", IdDevice: "1", Time: "11:01:00", Data: "1,12,23" }, { Type: "rtu", IdDevice: "1", Time: "11:02:00", Data: "5,10,21" } ]; function groupBy(objectArray, property, expectedGroups = []) { return objectArray.reduce(function (acc, obj) { let key = obj[property] if (!acc[key]) { acc[key] = [] } acc[key].push(obj) return acc }, Object.fromEntries(expectedGroups.map(k => [k, []]))) }; let groupedData = groupBy(modbusData, 'Type', [ 'rtu', 'tcp' ]); console.log(groupedData);
 .as-console-wrapper { top: 0; max-height: 100% !important; }

這是一個使用 ES5/6 結構的更精簡的版本。

 const modbusData = [ { Type: "rtu", IdDevice: "1", Time: "11:01:00", Data: "1,12,23" }, { Type: "rtu", IdDevice: "1", Time: "11:02:00", Data: "5,10,21" } ]; const groupBy = (arr, prop, requiredKeys = []) => arr.reduce((acc, obj) => ({ ...acc, [obj[prop]]: [...(acc[obj[prop]] ?? []), obj] }), Object.fromEntries(requiredKeys.map(k => [k, []]))); const groupedData = groupBy(modbusData, 'Type', [ 'rtu', 'tcp' ]); console.log(groupedData);
 .as-console-wrapper { top: 0; max-height: 100% !important; }

暫無
暫無

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

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