首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GroupBy对象阵列JavaScript

GroupBy对象阵列JavaScript
EN

Stack Overflow用户
提问于 2021-06-16 13:41:44
回答 2查看 56关注 0票数 0

我有一个建议:

代码语言: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" },
];

我打电话后:

代码语言:javascript
复制
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)

其结果将是:

代码语言:javascript
复制
{
  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中没有“类型”:"rtu“或"tcp”时,结果将返回一个空数组,如下所示:

代码语言:javascript
复制
{
  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: []
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-16 13:53:33

您需要将预期的组键作为还原器的初级对象传递。

代码语言:javascript
复制
>>> [ 'rtu', 'tcp' ]
代码语言:javascript
复制
<<< Object.fromEntries(expectedGroups.map(k => [k, []])) // { rtu: [], tcp: [] }

代码语言:javascript
复制
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);
代码语言:javascript
复制
.as-console-wrapper { top: 0; max-height: 100% !important; }

这里有一个更精简的版本,它使用ES5/6构造。

代码语言:javascript
复制
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);
代码语言:javascript
复制
.as-console-wrapper { top: 0; max-height: 100% !important; }

票数 2
EN

Stack Overflow用户

发布于 2021-06-16 13:51:10

尝试使用扩展运算符合并alltypes

代码语言:javascript
复制
let alltypes = { rtu: [], tcp: [] }
let result = {...alltypes, ...groupedData}

代码语言:javascript
复制
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)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68003879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档