如何过滤嵌套JSON中值为true的属性?需两种实现函数
JSON过滤:保留含true值的属性(两种实现)
原始JSON数据:
{ "name": "xyz", "version": "50", "A": true, "B": { "type": "" }, "C": { "D": true, "E": true }, "I": true }
需要实现两种过滤效果:
- 保留嵌套结构:仅保留顶层值为
true的字段,以及内部包含true的对象(对象内仅保留值为true的字段)
{ "A": true, "C": { "D": true, "E": true }, "I": true }
- 扁平化结构:将所有层级中值为
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
相关产品推荐
相关产品推荐

