JavaScript如何过滤嵌套对象,保留essential为真值的属性?
解决嵌套对象过滤:保留
essential为真值的项 首先咱们先拆解下你遇到的问题根源:
forEach无返回值:Array.prototype.forEach()只是遍历数组执行回调逻辑,它本身不会返回任何结果(默认返回undefined),所以你把它的执行结果赋值给resTwo和resThree,自然得到的是undefined。- 参数传递错误:
resThree里的forEach循环中,el是对象的键名(比如"piano"、"bass"),不是对应的对象值,调用getEssential(el)相当于给函数传了个字符串,完全不符合函数的参数要求。
接下来针对你的需求,我提供两种解决方案:一种适配你当前的两层嵌套结构,另一种是支持更深层级的通用递归版本。
适配两层嵌套的解决方案
如果你的对象结构固定是「外层乐器 -> 内层技巧」的两层嵌套,我们可以遍历外层每个键,对每个内层对象应用过滤逻辑,再重新组装成原结构的新对象:
const obj = { piano: { scales: { essential: 1 }, chords: { essential: 1 }, triads: { essential: 0 }, }, bass: { scales: { essential: 1 }, triads: { essential: 0 } }, }; // 保留你原本的单个内层对象过滤函数 function getEssentialItems(subObj) { return Object.fromEntries( Object.entries(subObj).filter(([, val]) => val.essential) ); } // 处理整个外层对象的函数 function filterEssentialFromRoot(rootObj) { return Object.fromEntries( Object.entries(rootObj).map(([key, subObj]) => { // 对每个内层对象过滤后,保留原键名 return [key, getEssentialItems(subObj)]; }) ); } const finalResult = filterEssentialFromRoot(obj); console.log(finalResult);
输出结果
{ piano: { scales: { essential: 1 }, chords: { essential: 1 } }, bass: { scales: { essential: 1 } } }
通用递归版本(支持任意深度嵌套)
如果以后你的对象嵌套层级更深(比如技巧下还有细分类型),可以用递归函数自动处理所有层级,只要遇到带essential属性的对象就判断是否保留:
const nestedObj = { piano: { scales: { major: { essential: 1 }, minor: { essential: 0 } }, chords: { essential: 1 }, triads: { essential: 0 } }, bass: { scales: { essential: 1 }, arpeggios: { essential: 1 } } }; function deepFilterEssential(obj) { // 若当前对象有essential属性,判断是否保留 if (typeof obj === 'object' && obj !== null && 'essential' in obj) { return obj.essential ? obj : undefined; } // 若为普通对象,递归处理每个子项 if (typeof obj === 'object' && obj !== null) { return Object.fromEntries( Object.entries(obj) .map(([key, val]) => [key, deepFilterEssential(val)]) // 过滤掉处理后为undefined的项 .filter(([, val]) => val !== undefined) ); } // 非对象类型直接返回 return obj; } const deepResult = deepFilterEssential(nestedObj); console.log(deepResult);
递归版本输出
{ piano: { scales: { major: { essential: 1 } }, chords: { essential: 1 } }, bass: { scales: { essential: 1 }, arpeggios: { essential: 1 } } }
总结来说,核心问题是误用了forEach(它不返回值)和参数传递错误,通过Object.fromEntries结合map/filter的组合,就能高效构建出你想要的原结构过滤后的对象。
内容的提问来源于stack exchange,提问作者noblerthanoedipus
相关产品推荐
相关产品推荐

