JavaScript如何合并值相同对象的键,值不同则创建新对象
解决方案
逻辑调整说明
你原有代码的问题是仅对比最终数组的第一个元素,没有对所有已存在的分组做校验。我们可以先按has_been_done的取值做分组聚合,再转成目标格式,逻辑更清晰也能适配任意顺序的输入:
完整可运行代码
// 初始化临时分组对象:key为revision值的序列化结果,value为对应年份数组 const groupMap: Record<string, { years: string[], value: any }> = {}; // 遍历所有revision条目 carArray[0].revision.forEach(rev => { for (const [year, revisionValue] of Object.entries(rev)) { // 用序列化后的revision值作为分组唯一标识 const valueKey = JSON.stringify(revisionValue); if (groupMap[valueKey]) { // 已有分组,追加年份 groupMap[valueKey].years.push(year); } else { // 无分组,新建分组 groupMap[valueKey] = { years: [year], value: revisionValue }; } } }); // 把分组转成目标格式的数组 const finalArray = Object.values(groupMap).map(group => { const yearKey = group.years.join(', '); return { [yearKey]: group.value }; });
输出说明
上述代码输出的finalArray就是你要求的结构:
[ {"1980, 1985, 1995": {"has_been_done": "true"}}, {"1990, 2000": {"has_been_done": "false"}} ]
你给出的目标示例外层{ [ ... ] }属于非法JS语法,如果你确实需要外层包裹对象,只需要改成const result = { data: finalArray }即可。
内容的提问来源于stack exchange,提问作者Shaï
相关产品推荐
相关产品推荐

