如何合并对象数组中分组属性的唯一值?Node.js实现求助
解决JSON分组属性值合并问题
我来帮你搞定这个需求!你的目标是把多个JSON对象里的同组属性值去重后用|连接起来,先看看你现有代码的问题,再给你一个简洁可靠的实现方案。
你的代码存在的几个问题
- 未声明循环变量:
i、j、k这些循环变量没有用let/const声明,会变成全局变量,容易引发意外问题。 - 分组属性处理逻辑混乱:你试图通过多层循环收集分组和属性,但没有正确遍历每个分组下的具体属性键值对,导致后续无法正确合并值。
- 未处理键的大小写差异:原数据里存在
"In stock"和"In Stock"两个大小写不同的键,你的代码没有统一处理,会导致这两个键被当成不同属性,而你的预期结果是合并它们的值。 - 变量未定义就使用:比如
combinedObject在赋值前没有声明,运行时会直接报错。
正确的实现代码
下面是符合你需求的Node.js代码,逻辑清晰且能正确处理所有情况:
const fs = require('fs'); // 读取并解析输入的JSON文件 const inputData = JSON.parse(fs.readFileSync('my.json', 'utf-8')); // 初始化最终合并结果的对象 const mergedResult = {}; // 遍历每个输入对象,逐个合并分组和属性 inputData.forEach(item => { // 遍历当前对象的所有分组(如PropertiesGroup1、PropertiesGroup2) Object.entries(item).forEach(([groupKey, groupProps]) => { // 如果结果中还没有该分组,创建一个空对象 if (!mergedResult[groupKey]) { mergedResult[groupKey] = {}; } const targetGroup = mergedResult[groupKey]; // 遍历当前分组下的所有属性键值对 Object.entries(groupProps).forEach(([propKey, propValue]) => { // 统一处理键的大小写差异(匹配你的预期结果,将"In Stock"转为"In stock") const normalizedPropKey = propKey === "In Stock" ? "In stock" : propKey; // 如果目标分组中没有该属性,初始化一个空数组用于存值 if (!targetGroup[normalizedPropKey]) { targetGroup[normalizedPropKey] = []; } // 仅当值存在时添加到数组(避免undefined) if (propValue !== undefined) { targetGroup[normalizedPropKey].push(propValue); } }); }); }); // 对每个属性的数组去重,并转换为"|"分隔的字符串 Object.values(mergedResult).forEach(group => { Object.entries(group).forEach(([propKey, propValues]) => { // 使用Set去重,再转回数组后用"|"连接 const uniqueValues = [...new Set(propValues)]; group[propKey] = uniqueValues.join(' | '); }); }); // 按照你的需求,将结果包装为数组格式 const finalOutput = [mergedResult]; // 输出结果(也可以写入文件) console.log(JSON.stringify(finalOutput, null, 2));
代码逻辑说明
- 读取并解析数据:从文件读取JSON并转为JavaScript对象。
- 遍历合并分组:逐个处理每个输入对象,把所有分组整合到
mergedResult中,每个分组下的属性用数组暂存所有值。 - 统一键的大小写:针对原数据中
"In stock"和"In Stock"的差异,做了统一转换,确保值能正确合并。 - 去重并生成字符串:用
Set对每个属性的数组去重,再用join(' | ')转为你需要的分隔格式。 - 包装结果格式:把最终对象包装为数组,和你预期的输出格式完全一致。
内容的提问来源于stack exchange,提问作者My Man
相关产品推荐
相关产品推荐

