You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并对象数组中分组属性的唯一值?Node.js实现求助

解决JSON分组属性值合并问题

我来帮你搞定这个需求!你的目标是把多个JSON对象里的同组属性值去重后用|连接起来,先看看你现有代码的问题,再给你一个简洁可靠的实现方案。

你的代码存在的几个问题

  1. 未声明循环变量:i、j、k这些循环变量没有用let/const声明,会变成全局变量,容易引发意外问题。
  2. 分组属性处理逻辑混乱:你试图通过多层循环收集分组和属性,但没有正确遍历每个分组下的具体属性键值对,导致后续无法正确合并值。
  3. 未处理键的大小写差异:原数据里存在"In stock"和"In Stock"两个大小写不同的键,你的代码没有统一处理,会导致这两个键被当成不同属性,而你的预期结果是合并它们的值。
  4. 变量未定义就使用:比如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));

代码逻辑说明

  1. 读取并解析数据:从文件读取JSON并转为JavaScript对象。
  2. 遍历合并分组:逐个处理每个输入对象,把所有分组整合到mergedResult中,每个分组下的属性用数组暂存所有值。
  3. 统一键的大小写:针对原数据中"In stock"和"In Stock"的差异,做了统一转换,确保值能正确合并。
  4. 去重并生成字符串:用Set对每个属性的数组去重,再用join(' | ')转为你需要的分隔格式。
  5. 包装结果格式:把最终对象包装为数组,和你预期的输出格式完全一致。

内容的提问来源于stack exchange,提问作者My Man

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:07:25