如何根据指定键数组过滤对象并合并对应值为无重复的新数组?
如何根据指定键数组过滤对象并合并对应值为无重复的新数组?
嗨,我来帮你解决这个问题~首先得指出你之前代码里的小问题:data是一个对象,而filter是数组的方法,所以直接用data.filter()肯定是行不通的,这就是你代码没生效的原因哦。
针对你的需求,我们可以分两步走:先把指定键对应的数组合并成一个大数组,再去掉里面的重复项。这里给你两种实现方式,你可以根据自己的环境选择:
方法一:用flatMap+Set(现代JS环境推荐)
这种写法简洁高效,一步到位:
const data = { 'TypeA': ['A1', 'A2', 'A3', 'A4'], 'TypeB': ['B1', 'B2', 'B3', 'B4'], 'TypeC': ['C1', 'C2', 'C3', 'C4'], }; const array = ['TypeA', 'TypeB']; // 核心代码 const result = [...new Set(array.flatMap(key => data[key] || []))]; console.log(result); // 输出:['A1', 'A2', 'A3', 'A4', 'B1', 'B2', 'B3', 'B4']
我给你拆解下每一步的作用:
array.flatMap(key => data[key] || []):遍历你指定的键数组,取出每个键对应的数组,flatMap会自动把多个数组合并成一维数组;加|| []是为了避免某个键在data里不存在时返回undefined,保证代码不会报错。new Set(...):利用Set不能存重复值的特性,自动帮我们去掉合并数组里的重复项。[...new Set(...)]:把Set转换回数组格式,得到最终的无重复结果。
方法二:兼容旧环境的写法(map+concat)
如果你的项目需要兼容不支持flatMap的旧浏览器,可以用这种方式:
const data = { 'TypeA': ['A1', 'A2', 'A3', 'A4'], 'TypeB': ['B1', 'B2', 'B3', 'B4'], 'TypeC': ['C1', 'C2', 'C3', 'C4'], }; const array = ['TypeA', 'TypeB']; // 先合并数组 const mergedArray = [].concat(...array.map(key => data[key] || [])); // 再去重 const result = [...new Set(mergedArray)]; console.log(result); // 输出和上面一致
这里用array.map()先取出所有目标数组,再用[].concat(...)把它们合并成一维,后续去重逻辑和方法一一样。
这样就能完美实现你想要的效果啦~
备注:内容来源于stack exchange,提问作者SM079
相关产品推荐
相关产品推荐

