首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重复的GroupBy对象数组Javascript

重复的GroupBy对象数组Javascript
EN

Stack Overflow用户
提问于 2021-06-17 09:09:35
回答 1查看 45关注 0票数 1

我有一个建议:

代码语言:javascript
复制
var modbusData = [
  { Type: "rtu", Mode: "master", IdDevice: "1", Time: "11:01:00", Data: "1,12,23" },
  { Type: "tcp", Mode: "client", IdDevice: "2", Time: "11:01:11", Data: "30,40,50" },
  { Type: "rtu", Mode: "slave", IdDevice: "1", Time: "11:02:00", Data: "5,10,21" },
  { Type: "tcp", Mode: "server", IdDevice: "2", Time: "11:02:11", Data: "32,44,53" },
];

在我调用一个函数对输入进行分组之后

代码语言:javascript
复制
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, []])))
};
const groupedData = groupBy(modbusData, 'Type', [ 'rtu', 'tcp' ]);
console.log(groupedData);

其结果将是:

代码语言:javascript
复制
{
  rtu: [
    { Type: 'rtu', Mode: 'master', IdDevice: '1', Time: '11:01:00', Data: '1,12,23' },
    { Type: 'rtu', Mode: 'slave', IdDevice: '1', Time: '11:02:00', Data: '5,10,21' }
  ],
  tcp: [
    { Type: 'tcp', Mode: 'client', IdDevice: '2', Time: '11:01:11', Data: '30,40,50' },
    { Type: 'tcp', Mode: 'server', IdDevice: '2', Time: '11:02:11', Data: '32,44,53' }
  ]
}

现在我想要一个带有模式的重复GroupBy,特别是当任何模式都不存在时,它们将返回空数组,结果是:

代码语言:javascript
复制
{
  rtu: {
    master: [{ Type: 'rtu', Mode: 'master', IdDevice: '1', Time: '11:01:00', Data: '1,12,23' }],
    slave: [{ Type: 'rtu', Mode: 'slave', IdDevice: '1', Time: '11:02:00', Data: '5,10,21' }]
  },
  tcp: {
    client: [{ Type: 'tcp', Mode: 'client', IdDevice: '2', Time: '11:01:11', Data: '30,40,50' }],
    server: [{ Type: 'tcp', Mode: 'server', IdDevice: '2', Time: '11:02:11', Data: '32,44,53' }]
  }
}

Edit1: SubRequest:输入时:

代码语言:javascript
复制
var modbusData = [
  { Type: "rtu", Mode: "master", IdDevice: "1", Time: "11:01:00", Data: "1,12,23" },
  { Type: "tcp", Mode: "client", IdDevice: "2", Time: "11:01:11", Data: "30,40,50" },
];

我希望输出在空数组中还包含模式从和服务器,如下所示:

代码语言:javascript
复制
{
  rtu: {
    master: [{ Type: 'rtu', Mode: 'master', IdDevice: '1', Time: '11:01:00', Data: '1,12,23' }],
    slave: []
  },
  tcp: {
    client: [{ Type: 'tcp', Mode: 'client', IdDevice: '2', Time: '11:01:11', Data: '30,40,50' }],
    server: []
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-17 09:29:46

您可以在最后再添加一个步骤,重用您的groupBy方法,并使用Object.entriesObject.fromEntries

代码语言:javascript
复制
const subGroupedData = Object.fromEntries(Object.entries(groupedData)
    .map( ([key,values]) => ([key, groupBy(values,'Mode')])))

活生生的例子:

代码语言:javascript
复制
var modbusData = [
  { Type: "rtu", Mode: "master", IdDevice: "1", Time: "11:01:00", Data: "1,12,23" },
  { Type: "tcp", Mode: "client", IdDevice: "2", Time: "11:01:11", Data: "30,40,50" },
  //{ Type: "rtu", Mode: "slave", IdDevice: "1", Time: "11:02:00", Data: "5,10,21" },
  //{ Type: "tcp", Mode: "server", IdDevice: "2", Time: "11:02:11", Data: "32,44,53" },
];

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, []])))
};
const groupedData = groupBy(modbusData, 'Type', [ 'rtu', 'tcp' ]);

const expectedSubGroups = {rtu: ['master','slave'], tcp:['client','server']}

const subGroupedData = Object.fromEntries(Object.entries(groupedData)
        .map( ([key,values]) => ([key, groupBy(values,'Mode', expectedSubGroups[key])])))

console.log(subGroupedData);

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

https://stackoverflow.com/questions/68016300

复制
相关文章

相似问题

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