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

How to group an array of objects and mapping it to a different structure?

实际上是关于映射对象数组并将其分组。有没有什么方法可以在没有 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"
      }
    ]
  }
]

我看过,但和预期的不太一样

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