如何从相似对象中创建唯一值数组?
合并多对象属性生成唯一值数组的实现方案
嘿,这个需求确实挺典型的,你想到用Set去重完全找对方向了!我来给你一步步拆解具体怎么实现,不管对象有多少个属性都能轻松处理~
核心思路
我们要做的其实就是三步:
- 收集每个属性的所有值(包括重复和
null的) - 过滤掉
null(如果需要的话也可以顺带过滤undefined) - 用
Set去重,再转回数组
具体实现
先看单个属性的处理
假设我们有一组结构相同的对象,先拿其中一个属性举例:
// 示例对象数组 const objects = [ { prop1: 'a', prop2: 'b', prop3: null }, { prop1: 'a', prop2: null, prop3: 'c' }, { prop1: null, prop2: 'b', prop3: 'c' }, { prop1: 'd', prop2: 'b', prop3: null } ]; // 提取prop1的唯一非null值 const uniqueProp1 = [...new Set( objects.map(obj => obj.prop1).filter(val => val !== null) )]; // 结果:['a', 'd']
扩展到任意数量的属性
如果要批量处理所有属性,我们可以用Object.keys()获取所有属性名,再配合reduce来生成最终的结果对象:
// 先获取所有属性名(假设数组第一个对象的结构代表所有对象的结构) const allPropNames = Object.keys(objects[0]); // 批量处理每个属性 const uniquePropsResult = allPropNames.reduce((result, propName) => { // 收集当前属性的所有非null值,去重后转数组 result[propName] = [...new Set( objects.map(obj => obj[propName]).filter(val => val !== null) )]; return result; }, {}); // 最终输出: // { // prop1: ['a', 'd'], // prop2: ['b'], // prop3: ['c'] // }
一些优化点
- 如果你的对象里可能存在
undefined值,想一起过滤的话,可以把过滤条件改成val != null(注意是双等号,同时过滤null和undefined) - 如果对象数组可能为空,记得先做判断,比如:
if (!objects.length) { console.log('对象数组为空,请检查输入'); return {}; } - 如果属性值是引用类型(比如对象),
Set没法直接去重,这时候你需要先把引用类型转成可比较的原始值(比如JSON字符串),不过看你的需求应该是处理基本类型,这个暂时不用考虑~
这个方法我平时处理批量属性去重的时候经常用,不管是3个属性还是n个属性,都能快速搞定,而且代码也很简洁易懂。
内容的提问来源于stack exchange,提问作者Clay Banks
相关产品推荐
相关产品推荐

