如何处理多层对象数组的重复项并合并选项生成指定格式
分类数组去重合并并转换指定格式的解决方案
问题背景
有一个自动生成的对象数组,需要完成以下操作:
- 清理数据:去除分类重复项,合并同一分类下的不重复选项
- 转换为指定格式的字符串
示例输入
const categories = [ { category: "mammal", options: ["horse", "cow"] }, { category: "mammal", options: ["pig", "cow"] }, { category: "gender", options: ["male"] }, { category: "mammal", options: ["cow"] }, { category: "mammal", options: ["pig"] }, { category: "gender", options: ["female"] } ];
期望输出
mammal>horse;cow;pig/gender>male;female/
现有尝试及问题
尝试代码1仅得到去重后的分类列表:
const newArr = []; for (let i = 0; i < categories.length; i++) { categoryIsInArray = newCat.indexOf(categories[i].category) !== -1; if (categoryIsInArray === true) { // do something with the options } else { newArr.push(categories[i].category) } }
结果:
["mammal","gender"]
尝试代码2逻辑混乱,导致结果错误:
const newArr = []; for (let i = 0; i < categories.length; i++) { categoryIsInArray = newCat.indexOf(categories[i].category) !== -1; if (categoryIsInArray === true) { for (let j = 0; j < categories[i].options.length; j++) { optionIsInArray = newCat.indexOf(categories[i].options[j]) !== -1; if(optionIsInArray === false) { newCat.push(categories[i].options) } } } else { newArr.push(categories[i].category) } }
错误结果:
[ 'mammal', ['horse', 'cow'], ['horse', 'cow'], 'gender', ['cow'], ['horse'], ['female'] ]
解决方案
核心思路是用对象存储分类与对应去重选项,利用对象键的唯一性管理分类,用Set自动去重选项,最后拼接成目标字符串。
完整代码
// 1. 创建空对象,存储分类和对应的去重选项 const categoryMap = {}; // 2. 遍历原数组,填充categoryMap categories.forEach(item => { const { category, options } = item; // 分类不存在则初始化空Set if (!categoryMap[category]) { categoryMap[category] = new Set(); } // 将选项添加到Set自动去重 options.forEach(opt => categoryMap[category].add(opt)); }); // 3. 转换为目标格式字符串 const result = Object.entries(categoryMap) .map(([cat, opts]) => `${cat}>${Array.from(opts).join(';')}`) .join('/') + '/'; console.log(result); // 输出:mammal>horse;cow;pig/gender>male;female/
代码解释
- 创建categoryMap:键为分类名称,值为
Set类型,利用Set的特性自动去重选项。 - 遍历原数组:
- 取出每个对象的
category和options - 若分类不在
categoryMap中,创建新的Set - 将当前选项全部添加到对应分类的
Set中,重复值会被自动忽略
- 取出每个对象的
- 转换为目标字符串:
- 用
Object.entries将categoryMap转为键值对数组 - 把每个键值对拼接成
分类>选项1;选项2的格式 - 用
/连接所有拼接后的字符串,最后追加一个/
- 用
内容的提问来源于stack exchange,提问作者UntitledGraphic
相关产品推荐
相关产品推荐

