如何按Group ID分组JavaScript对象并转换为指定结构?
按Group分组并转换JavaScript对象数组结构
我有如下JavaScript对象数组:
[ { "id": "41e4858d-0478-4ffa-b39a-73db6f80c493", "price": 10, "class": "audi", "group": { "id": "group-1", "name": "Special" } }, { "id": "d4ed6efe-3d95-4f19-9f34-16b1d62ee5f1", "price": 20, "class": "mercedess", "group": { "id": "group-1", "name": "Special" } }, { "id": "a17a3671-09c4-411c-921f-a35705e86030", "price": 30, "class": "bmw", "group": { "id": "group-1", "name": "Special" } }, { "id": "1bda1fe8-c326-46f4-851c-d06c686d1ebc", "price": 50, "class": "audi", "group": { "id": "group-2", "name": "Normal" } }, { "id": "72300db9-c7f8-4bd6-af4a-f041e085bc6b", "price": 60, "class": "mercedess", "group": { "id": "group-2", "name": "Normal" } }, { "id": "3fd3a054-3f97-4899-ba28-e1f22ba40bc8", "price": 70, "class": "bmw", "group": { "id": "group-2", "name": "Normal" } } ]
需要按group.id分组,转换为如下结构:
[ { "id": "group-1", "name": "special", "mercedess": 20, "bmw": 30, "audi": 10 }, { "id": "group-2", "name": "normal", "mercedess": 60, "bmw": 70, "audi": 50 } ]
注:你期望输出里的auid应为笔误,以下代码均按正确的audi字段处理。
原生JavaScript实现(使用reduce)
通过reduce先构建分组映射对象,再将其转换为目标数组:
const data = [/* 你的原始数组 */]; // 第一步:按group.id构建分组结构 const groupedMap = data.reduce((acc, item) => { const groupId = item.group.id; // 初始化分组基础信息 if (!acc[groupId]) { acc[groupId] = { id: groupId, name: item.group.name.toLowerCase() }; } // 将车型和价格绑定到对应分组 acc[groupId][item.class] = item.price; return acc; }, {}); // 第二步:将映射对象转为数组 const result = Object.values(groupedMap); console.log(result);
Lodash实现
利用groupBy快速分组,再通过map和reduce处理每个分组的结构:
const _ = require('lodash'); // 或通过CDN引入lodash const data = [/* 你的原始数组 */]; const result = _.chain(data) .groupBy('group.id') .map((items, groupId) => { // 基于分组第一个元素初始化基础结构 const baseStructure = { id: groupId, name: items[0].group.name.toLowerCase() }; // 遍历分组内元素,添加车型-价格键值对 return items.reduce((acc, item) => { acc[item.class] = item.price; return acc; }, baseStructure); }) .value(); console.log(result);
内容的提问来源于stack exchange,提问作者baharat
相关产品推荐
相关产品推荐

