如何对一组对象进行分组并将其映射到不同的结构?

Posted

技术标签:

【中文标题】如何对一组对象进行分组并将其映射到不同的结构?【英文标题】:How to group an array of objects and mapping it to a different structure? 【发布时间】:2021-12-27 03:57:43 【问题描述】:

这实际上是关于映射一组对象并将其分组。有没有办法在没有 lodash 的情况下以 javascript 方式转换这个数组

let fruits = [
  
    id: 1,
    expired_date: "2021-11-30",
    name: "mango"
  ,
  
    id: 2,
    expired_date: "2021-11-20",
    name: "kiwi"
  ,
  
    id: 3,
    expired_date: "2021-11-20",
    name: "orange"
  ,
  
    id: 4,
    expired_date: "2021-11-10",
    name: "banana"
  ,
  
    id: 5,
    expired_date: "2021-11-10",
    name: "apple"
  
]

分组到这样的东西? (按对象中的一个键分组,用2个键包裹在一个对象中,一个包含类别,另一个包含与组相关的对象)

let fruits = [
  
    expired_date: "2021-11-30",
    rows: [
      
        id: 1,
        expired_date: "2021-11-30",
        name: "mango"
      
    ]
  ,
  
    expired_date: "2021-11-20",
    rows: [
      
        id: 2,
        expired_date: "2021-11-20",
        name: "kiwi"
      ,
      
        id: 3,
        expired_date: "2021-11-20",
        name: "orange"
      
    ]
  ,
  
    expired_date: "2021-11-10",
    rows: [
      
        id: 4,
        expired_date: "2021-11-10",
        name: "banana"
      ,
      
        id: 5,
        expired_date: "2021-11-10",
        name: "apple"
      
    ]
  
]

我读过this question,但与预期的不太一样

【问题讨论】:

【参考方案1】:

Array.reduce 应该可以工作

const fruits = [      id: 1,    expired_date: "2021-11-30",    name: "mango"  ,      id: 2,    expired_date: "2021-11-20",    name: "kiwi"  ,      id: 3,    expired_date: "2021-11-20",    name: "orange"  ,      id: 4,    expired_date: "2021-11-10",    name: "banana"  ,      id: 5,    expired_date: "2021-11-10",    name: "apple"  ];

const result = Object.values(fruits.reduce((acc, item) => 
    (acc[item.expired_date]??=expired_date: item.expired_date, rows: []).rows.push(item);
    return acc;
, ));

console.log(result);

修改后未分配??=,IE 不支持。

const result = Object.values(fruits.reduce((acc, item) => 
  if (acc[item.expired_date]) 
    acc[item.expired_date].rows.push(item);
   else 
    acc[item.expired_date] = expired_date: item.expired_date, rows: [item];
  
  return acc;
, ));

【讨论】:

谢谢,但??= 是什么意思?我得到了SyntaxError: Unexpected token '??=' @lorem_impus 逻辑无效赋值 (??=) developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 我应用了第二个版本。成功了,谢谢。

以上是关于如何对一组对象进行分组并将其映射到不同的结构?的主要内容,如果未能解决你的问题,请参考以下文章

如何按键对一组对象进行分组?

通过其字段的不同值对Realm对象进行分组

如何在 Hive SQL 中对一列中的数据进行分组并将其分布在另一列中?

Mysql,如何使用另一列的最大值对一组行进行分组?

我们如何识别一组节点并将该组添加到另一个 XSLT 中 XML 源结构不同的节点?

Vertica:将字符串拆分为数组并将其分组以获取一组唯一值?