如何在Angular 5或TypeScript中获取JSON中值为false的键
嘿,我来帮你搞定这个问题!在Angular 5或者TypeScript环境下,要从你给出的这个嵌套对象里揪出所有值为false的键,咱们分两种场景来处理——毕竟你的对象里还有嵌套的子对象呢~
首先先把你给出的对象用TypeScript的格式整理出来:
const xyz = { abc: { 'a': true, 'b': true, 'c': true, 'd': false, 'e': { 'f': true, 'g': false }, 'h': true, 'i': true } };
1. 浅层查找(只找第一层直接子属性)
如果只需要提取abc对象下直接子属性里值为false的键,用Object.entries配合过滤就能轻松实现:
// 先取出abc对象 const abcObj = xyz.abc; // 过滤并提取值为false的键 const shallowFalseKeys = Object.entries(abcObj) .filter(([key, value]) => value === false) .map(([key]) => key); console.log(shallowFalseKeys); // 输出结果:['d']
简单解释下:Object.entries会把对象转换成[键, 值]格式的数组,我们先过滤出值为false的项,再把对应的键提取出来就行。
2. 深层递归查找(包含所有嵌套子对象)
因为你的对象里有e这个嵌套子对象,里面的g也是false,如果要把所有层级里的false键都找出来,就得写个递归函数来遍历:
function findAllFalseKeys(obj: Record<string, any>): string[] { let falseKeys: string[] = []; for (const [key, value] of Object.entries(obj)) { // 找到值为false的键,直接存入数组 if (value === false) { falseKeys.push(key); } // 如果当前值是对象且不是null,就递归查找子对象 else if (typeof value === 'object' && value !== null) { falseKeys = falseKeys.concat(findAllFalseKeys(value)); } } return falseKeys; } // 调用函数传入abc对象 const allFalseKeys = findAllFalseKeys(xyz.abc); console.log(allFalseKeys); // 输出结果:['d', 'g']
这里要注意判断value !== null,因为typeof null的结果也是object,得把这种情况排除掉。
额外:TypeScript类型优化
如果想让代码更符合TypeScript的类型安全要求,避免用any,可以自定义嵌套对象的类型:
// 定义嵌套对象的类型:值要么是boolean,要么是嵌套对象 type NestedBooleanObject = { [key: string]: boolean | NestedBooleanObject }; function findAllFalseKeys(obj: NestedBooleanObject): string[] { let falseKeys: string[] = []; for (const [key, value] of Object.entries(obj)) { if (value === false) { falseKeys.push(key); } else { // 因为类型定义,这里value肯定是嵌套对象,不用再判断null falseKeys = falseKeys.concat(findAllFalseKeys(value)); } } return falseKeys; }
内容的提问来源于stack exchange,提问作者Shashwatee Shwetapadma
相关产品推荐
相关产品推荐

