在js中分组后,如何将对象数组转换为单个对象?

zwghvu4y  于 2021-09-13  发布在  Java
关注(0)|答案(2)|浏览(279)

我有一个下面的对象数组

[
  {
    "date": "2021-07-24",
    "model": "Benz",
    "bookings": 3
  },
  {
    "date": "2021-07-24",
    "model": "BMW",
    "bookings": 4
  },
  {
    "date": "2021-07-24",
    "model": "Audi",
    "bookings": 1
  },
  {
    "date": "2021-07-25",
    "model": "Benz",
    "bookings": 5
  },
  {
    "date": "2021-07-25",
    "model": "BMW",
    "bookings": 7
  },
  {
    "date": "2021-07-25",
    "model": "Audi",
    "bookings": 3
  }
]

在js中,我如何在分组后将其转换为下面的一个?
预期:

[
  {
    "date": "2021-07-24",
    "Benz": 3,
    "BMW": 4,
    "Audi": 1
  },
  {
    "date": "2021-07-25",
    "Benz": 5,
    "BMW": 7,
    "Audi": 3
  }
]

关于实施它的想法将非常有用。尝试实现此处提到的不同分组方法
但上述情况下所提到的预期产出很适合这一目的

dfuffjeb

dfuffjeb1#

可以对贴图对象使用reduce()。
编辑: data.reduce() 将返回一个 Map 对象,您可以使用 .values() 获取贴图对象的值。
然后您可以使用spread操作符 ... 获取数组中贴图对象的值。
简言之:

const output = [...data.reduce().values()]

示例如下:

const data = [ { date: "2021-07-24", model: "Benz", bookings: 3, }, { date: "2021-07-24", model: "BMW", bookings: 4, }, { date: "2021-07-24", model: "Audi", bookings: 1, }, { date: "2021-07-25", model: "Benz", bookings: 5, }, { date: "2021-07-25", model: "BMW", bookings: 7, }, { date: "2021-07-25", model: "Audi", bookings: 3, }, ];

const o = [
  ...data
    .reduce((a, b) => {
      if (a.has(b.date)) {
        let obj = a.get(b.date);
        if (obj[b.model]) {
          obj = { ...obj, [b.model]: obj[b.model] + b.bookings };
        } else {
          obj = { ...obj, [b.model]: b.bookings };
        }
        a.set(b.date, obj);
      } else {
        a.set(b.date, { date: b.date, [b.model]: b.bookings });
      }
      return a;
    }, new Map())
    .values(),
];

console.log(o);
erhoui1w

erhoui1w2#

你可以按日期把它们重新分组。

let a  = [
{
    "date": "2021-07-24",
    "Benz": 3,
    "BMW": 4,
    "Audi": 1
  },
  {
    "date": "2021-07-25",
    "Benz": 5,
    "BMW": 7,
    "Audi": 3
  }
]
let groupBy = a.reduce((r, a) => {
  r[a.date] = r[a.date] || []
  r[a.date].push(a)
  return r
}, {})

console.log(groupBy)

相关问题