首页 > 解决方案 > 如何对一组对象进行分组并将其映射到不同的结构?

问题描述

它实际上是关于映射一组对象并将其分组。有没有办法在没有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"
      }
    ]
  }
]

我已经阅读了这个问题,但它与预期的不太一样

标签: javascriptarraysobjectmapping

解决方案


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;
}, {}));

推荐阅读