如何基于指定允许键数组过滤对象数组,仅保留目标键对应属性
问题原因
你混淆了filter和map的使用场景:
Array.filter的作用是根据布尔判断结果,决定保留或移除数组中的整个元素,不会修改元素内部的属性结构- 你的需求是保留所有外层和内层元素,仅裁剪
row子项的多余属性,应该使用Array.map遍历修改元素结构
你原有代码的运行逻辑是:内层el.row.filter返回包含所有row元素的非空数组,在外层filter的判断条件里会被转为布尔值true,所以最终会返回完整的原始data数据,不会做任何属性裁剪。
正确实现代码
const data = [{ id: 1, row: [{ id: 'a', name: 'ab', code: 'sdf', version: 1 }, { id: 'b', name: 'bc', code: 'def', version: 3 }, { id: 'c', name: 'cd', code: 'afd', version: 2 }, ] }, { id: 2, row: [{ id: 'd', name: 'ef', code: 'sdf', version: 1 }, { id: 'e', name: 'gh', code: 'def', version: 3 }, { id: 'f', name: 'ij', code: 'afd', version: 2 }, ] }, { id: 3, row: [{ id: 'g', name: 'kl', code: 'asd', version: 2 }, { id: 'h', name: 'mn', code: 'faf', version: 3 }, { id: 'i', name: 'op', code: 'dfs', version: 1 }, ] } ] const allowed = ['id', 'name'] const result = data.map(el => { // 保留外层id属性,遍历裁剪row子项的属性 return { id: el.id, row: el.row.map(elm => Object.fromEntries(allowed.map(k => [k, elm[k]]))) } }) console.log(result)
实现逻辑
- 遍历外层
data数组的每一项,保留外层的id字段 - 遍历每一项的
row数组,对每个子对象通过allowed.map提取指定键的键值对,再用Object.fromEntries组合为裁剪后的新对象
内容的提问来源于stack exchange,提问作者Vishnu Shenoy
相关产品推荐
相关产品推荐

