javascript - 如何对一组对象进行分组并将其映射到不同的结构?
问题描述
它实际上是关于映射一组对象并将其分组。有没有办法在没有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;
}, {}));
推荐阅读
- java - 如何在 JAVA 中使用二维数组从用户那里获取多个输入?
- ios - **[Assert] UIKit 客户端错误:-[UIWindow setScreen:] 如果客户端采用 UIScene 生命周期,则不应调用
- javascript - 在自动完成中未找到结果时显示消息
- ios - dyld:库未加载:@rpath/MapboxMobileEvents.framework/MapboxMobileEvents
- linux - Liberty Profile - 在 Linux 中出现错误 [无法启动新的 UOW。LocalTransactionContainment 已经在工作中处于活动状态]
- java - Spring Boot - 发送短信的调度程序
- java - 管理字符串的有效方法
- mysql - Redmine 中的间歇性 500 内部服务器错误
- ms-access - 'Microsoft.ACE.OLEDB.12.0' 提供程序未在本地计算机 Office 365 上注册
- concurrency - Consumer 在 60000 毫秒内启动失败;任务执行器是否有足够的线程来支持容器并发?