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

如何过滤嵌套JSON中值为true的属性?需两种实现函数

JSON过滤:保留含true值的属性(两种实现)

原始JSON数据:

{
  "name": "xyz",
  "version": "50",
  "A": true,
  "B": {
    "type": ""
  },
  "C": {
    "D": true,
    "E": true
  },
  "I": true
}

需要实现两种过滤效果:

  1. 保留嵌套结构:仅保留顶层值为true的字段,以及内部包含true的对象(对象内仅保留值为true的字段)
{
  "A": true,
  "C": {
    "D": true,
    "E": true
  },
  "I": true
}
  1. 扁平化结构:将所有层级中值为true的字段提取到顶层,去除嵌套结构
{
  "A": true,
  "D": true,
  "E": true,
  "I": true
} 

现有函数仅能识别顶层的true值,无法处理嵌套对象内的true,因此仅返回A和I两个字段,无法满足需求。


1. 保留嵌套结构的过滤函数

通过递归遍历对象,只保留值为true的字段,以及内部存在有效true字段的嵌套对象:

function filterNestedTrue(obj) {
  const result = {};
  for (const key in obj) {
    const value = obj[key];
    // 直接保留值为true的字段
    if (value === true) {
      result[key] = value;
    } 
    // 递归处理非空对象
    else if (typeof value === 'object' && value !== null) {
      const filteredChild = filterNestedTrue(value);
      // 仅当递归处理后有有效字段时,才保留该嵌套对象
      if (Object.keys(filteredChild).length > 0) {
        result[key] = filteredChild;
      }
    }
  }
  return result;
}

测试调用示例:

const originalData = {
  "name": "xyz",
  "version": "50",
  "A": true,
  "B": { "type": "" },
  "C": { "D": true, "E": true },
  "I": true
};

console.log(filterNestedTrue(originalData));
// 输出符合保留嵌套结构的期望结果

2. 扁平化结构的过滤函数

递归遍历所有层级,将所有值为true的字段提取到顶层对象中:

function flattenTrue(obj) {
  const result = {};
  function traverse(currentObj) {
    for (const key in currentObj) {
      const value = currentObj[key];
      if (value === true) {
        result[key] = value;
      } 
      else if (typeof value === 'object' && value !== null) {
        traverse(value);
      }
    }
  }
  traverse(obj);
  return result;
}

测试调用示例:

console.log(flattenTrue(originalData));
// 输出符合扁平化结构的期望结果

内容的提问来源于stack exchange,提问作者Abi.D

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 19:40:57