You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript如何过滤嵌套对象,保留essential为真值的属性?

解决嵌套对象过滤:保留essential为真值的项

首先咱们先拆解下你遇到的问题根源:

  1. forEach无返回值:Array.prototype.forEach()只是遍历数组执行回调逻辑,它本身不会返回任何结果(默认返回undefined),所以你把它的执行结果赋值给resTwo和resThree,自然得到的是undefined。
  2. 参数传递错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 08:57:43