如何深度过滤非数组对象?JS原生函数提取指定属性行键
实现思路与代码方案
没问题,这事儿用JS原生的数组高阶函数就能轻松搞定,针对你的需求,这里提供两种常用的实现方式,附带思路拆解:
方案1:Object.entries() + filter() + map() 组合
这种方式逻辑拆分清晰,可读性强,是比较直观的实现思路:
const table = { row1: { col1: 'A', col2: 'B', col3: 'C' }, row2: { col1: 'D', col2: 'A', col3: 'F' }, row3: { col1: 'E', col2: 'G', col3: 'C' } }; const targetRows = Object.entries(table) // 过滤出col3等于"C"的键值对 .filter(([rowKey, rowData]) => rowData.col3 === 'C') // 提取符合条件的行键 .map(([rowKey]) => rowKey); console.log(targetRows); // 输出: ['row1', 'row3']
步骤拆解:
Object.entries(table):把对象转换为键值对数组,结构为[['row1', {col1: 'A', ...}], ['row2', ...]],这样就能用数组的高阶函数处理了;filter():解构出每个项的行键和行数据,判断行数据的col3是否等于"C",只保留符合条件的键值对;map():从过滤后的键值对中提取出行键,最终得到目标数组。
方案2:Object.keys() + reduce() 一步到位
如果喜欢更简洁的写法,用reduce()可以把过滤和提取合并为一步:
const table = { row1: { col1: 'A', col2: 'B', col3: 'C' }, row2: { col1: 'D', col2: 'A', col3: 'F' }, row3: { col1: 'E', col2: 'G', col3: 'C' } }; const targetRows = Object.keys(table).reduce((acc, rowKey) => { // 若当前行col3等于"C",就把行键加入累加器 if (table[rowKey].col3 === 'C') { acc.push(rowKey); } return acc; }, []); // 初始累加器设为空数组 console.log(targetRows); // 输出: ['row1', 'row3']
步骤拆解:
Object.keys(table):先获取所有行的键数组,比如['row1', 'row2', 'row3'];reduce():以空数组为初始值,遍历每个行键,判断对应行的col3是否符合条件,符合则将行键推入累加器,最后返回累加器就是结果。
两种方案都能完美满足你的需求,根据自己的代码风格选择即可~
内容的提问来源于stack exchange,提问作者thdoan
相关产品推荐
相关产品推荐

