JS匹配嵌套data数组键名与fields值,筛选对应键值对
问题排查与解决方案
原代码错误点
- 结构识别错误:
data的每个子项是[标题字符串, 属性对象]的二元数组,你直接对data[i]执行filter操作完全不符合数据结构逻辑,遍历拿到的元素没有fields属性,所以会报错返回undefined - 匹配逻辑错误:需求是提取属性对象中键名存在于
fields的键值对,而非判断属性对象的所有键都在fields里,逻辑方向完全错误 - 结果收集错误:每次循环都重新声明
results变量,没有累积匹配结果,最终无法得到完整的输出数组
正确实现代码
JavaScript版本
const results = [] for (const item of data) { const [title, props] = item const matched = {} // 筛选属性对象中键名在fields里的键值对 for (const key in props) { if (fields.includes(key)) { matched[key] = props[key] } } // 有匹配结果才推入结果数组 if (Object.keys(matched).length > 0) { results.push([title, matched]) } } console.log(results)
函数式简写版本
const results = data.reduce((res, [title, props]) => { const matched = Object.fromEntries( Object.entries(props).filter(([key]) => fields.includes(key)) ) return Object.keys(matched).length ? [...res, [title, matched]] : res }, [])
逻辑说明
- 遍历
data所有子项,拆分出标题和对应的属性对象 - 对每个属性对象,遍历所有键值对,筛选出键名存在于
fields数组的项,组成新的匹配对象 - 仅当匹配对象非空时,将标题+匹配对象的组合推入最终结果数组
- 最终得到的
results完全符合预期输出结构
内容的提问来源于stack exchange,提问作者Simon Palmer
相关产品推荐
相关产品推荐

