JavaScript:提取复杂对象数组中bbb下的ccc数值生成扁平数组
解决复杂对象数组的属性筛选问题
问题需求
遍历给定的对象数组,仅收集直接属于bbb对象下的ccc属性值(要求ccc是数值类型),不符合条件的位置填0,最终得到数组:[11, 0, 0, 0, 511, 77, 0, 0]
现有代码的问题
- 递归逻辑只取对象的第一个属性(
objEntries[0]),处理bbb内部结构时逻辑混乱,无法正确判断bbb下是否存在合法的ccc - 对非目标结构的情况(比如
aaa是数字、bbb是数字)没有返回0的处理,会导致结果数组出现undefined - 递归的终止条件和分支判断不完整,遗漏了多种异常场景
正确实现代码
方案一:使用可选链(简洁版,支持ES2020+)
const arr = [ { aaa: { bbb: { ccc: 11 } } }, { aaa: { bbb: { eee: { ccc: 12 } } } }, { aaa: { bbb: 101} }, { }, { aaa: { bbb: { ccc: 511 } } }, { aaa: { bbb: { ccc: 77 } } }, { aaa: 24 }, { aaa: { bbb: { ccc: {ddd: 11 } } } }, ]; const result = arr.map(item => { // 逐层检查:aaa是对象 → bbb是对象 → ccc是数字 const cccValue = item?.aaa?.bbb?.ccc; return typeof cccValue === 'number' ? cccValue : 0; }); console.log(result); // 输出 [11, 0, 0, 0, 511, 77, 0, 0]
方案二:兼容旧环境的严谨判断
const arr = [ { aaa: { bbb: { ccc: 11 } } }, { aaa: { bbb: { eee: { ccc: 12 } } } }, { aaa: { bbb: 101} }, { }, { aaa: { bbb: { ccc: 511 } } }, { aaa: { bbb: { ccc: 77 } } }, { aaa: 24 }, { aaa: { bbb: { ccc: {ddd: 11 } } } }, ]; const result = arr.map(item => { // 逐层验证类型,避免类型错误 if (typeof item === 'object' && item !== null && 'aaa' in item) { const aaa = item.aaa; if (typeof aaa === 'object' && aaa !== null && 'bbb' in aaa) { const bbb = aaa.bbb; if (typeof bbb === 'object' && bbb !== null && 'ccc' in bbb) { const ccc = bbb.ccc; if (typeof ccc === 'number') { return ccc; } } } } return 0; }); console.log(result); // 输出 [11, 0, 0, 0, 511, 77, 0, 0]
逻辑说明
- 遍历数组时,对每个元素逐层检查属性存在性和类型:
- 先判断当前元素是有效对象,且包含
aaa属性 - 判断
aaa是有效对象,且包含bbb属性 - 判断
bbb是有效对象,且包含ccc属性,同时ccc是数值类型
- 先判断当前元素是有效对象,且包含
- 任何一层不满足条件,直接返回
0
内容的提问来源于stack exchange,提问作者Henkkas
相关产品推荐
相关产品推荐

