JavaScript如何按policy属性值分组对象数组并聚合action、company字段
实现方案
方案1:原生JavaScript实现(无第三方依赖)
// 原始输入数据 const rawData = [ { "action": "VIEW", "policy": "FORM" }, { "action": "CREATE", "policy": "USER" }, { "action": "VIEW", "policy": "USER" }, { "company": "Microsoft", "policy": "FORM" }, { "company": "Facebook", "policy": "USER" }, { "company": "Twitter", "policy": "USER" } ]; // 处理逻辑 const processedResult = rawData.reduce((acc, current) => { const { policy, action, company } = current; // 初始化对应policy的分组结构 if (!acc[policy]) { acc[policy] = { action: [], company: [] }; } // 聚合action字段:存在值且未重复则加入 if (action && !acc[policy].action.includes(action)) { acc[policy].action.push(action); } // 聚合company字段:存在值且未重复则加入 if (company && !acc[policy].company.includes(company)) { acc[policy].company.push(company); } return acc; }, {}); console.log(processedResult);
方案2:Lodash实现
const _ = require('lodash'); // 原始输入数据和方案1一致 const rawData = [ { "action": "VIEW", "policy": "FORM" }, { "action": "CREATE", "policy": "USER" }, { "action": "VIEW", "policy": "USER" }, { "company": "Microsoft", "policy": "FORM" }, { "company": "Facebook", "policy": "USER" }, { "company": "Twitter", "policy": "USER" } ]; // 处理逻辑:先按policy分组,再对每个分组做字段聚合去重 const processedResult = _.mapValues( _.groupBy(rawData, 'policy'), group => ({ // 提取所有action值,过滤空值后去重 action: _.uniq(_.compact(group.map(item => item.action))), // 提取所有company值,过滤空值后去重 company: _.uniq(_.compact(group.map(item => item.company))) }) ); console.log(processedResult);
两种方案的输出结果均与要求的预期结构完全一致。
内容的提问来源于stack exchange,提问作者Dogukan Karabeyin
相关产品推荐
相关产品推荐

