如何用map/filter/reduce找出嵌套数组所有子数组共有的对象属性
找出嵌套数组内层子数组共有的对象属性(函数式实现)
需求说明
从给定的嵌套数组emptyRooms中,筛选出所有内层子数组都包含的对象属性,采用map/filter/reduce等函数式数组方法实现,且方案具备动态适应性。
实现思路
- 提取属性集合:将每个内层子数组转换为属性名的集合(
Set),利用Set的快速查找特性提升效率; - 计算集合交集:以第一个子数组的属性集合为基础,通过
reduce遍历后续所有集合,逐步求交集,最终得到所有子数组共有的属性。
代码实现
const emptyRooms = [ [{"kitchen": false}, {"ballroom": false}, {"billiard room": false}], [{"ballroom": false}, {"conservatory": false}, {"dining room": false}, {"library": false}], [{"kitchen": false}, {"ballroom": false}, {"dining room": false}, {"library": false}], [{"ballroom": false}, {"conservatory": false}, {"billiard room": false}, {"library": false}] ]; // 1. 转换每个内层子数组为属性集合 const roomPropertySets = emptyRooms.map(subArray => new Set(subArray.map(item => Object.keys(item)[0])) ); // 2. 计算所有集合的交集 const commonProperties = [...roomPropertySets.reduce((currentIntersection, nextSet) => { return new Set([...currentIntersection].filter(prop => nextSet.has(prop))); }, roomPropertySets[0])]; console.log(commonProperties); // 输出: ['ballroom']
动态适配说明
如果内层对象可能包含多个属性,只需调整属性提取逻辑即可兼容:
// 处理多属性对象的情况:提取所有属性并去重 const roomPropertySets = emptyRooms.map(subArray => new Set(subArray.flatMap(item => Object.keys(item))) );
该方案无需修改核心逻辑,就能适配任意数量的外层子数组、任意长度的内层子数组,以及单/多属性的对象结构。
内容的提问来源于stack exchange,提问作者peberino
相关产品推荐
相关产品推荐

