如何从嵌套对象数组中提取所有id值?
提取嵌套对象中所有id值的最优实现
针对你给出的嵌套对象结构,之前用多层map得到了嵌套数组,想要得到一维的id数组,可以用以下几种高效方法:
方法一:链式flatMap(推荐,结构固定时使用)
flatMap相当于先执行map再对结果调用flat(1),能直接避免多层嵌套:
const ids = obj.responseArray.flatMap(item => item?.accounts.flatMap(acc => acc.products.map(prod => prod.id) ) ); // 结果:["123", "456", "987", "654"]
这种写法简洁直接,每一层的flatMap都会把当前层级的数组展平一层,最终得到一维的id数组。
方法二:先map再深层扁平化
如果你已经有了之前的map结果,可以用flat(Infinity)直接展平所有嵌套层级:
const mapped = obj.responseArray.map(item => item?.accounts.map(acc => acc.products.map(prod => prod.id))); const ids = mapped.flat(Infinity); // 结果:["123", "456", "987", "654"]
flat(Infinity)会无视嵌套深度,把所有子数组都展平成一维,适合不确定嵌套层数的场景。
方法三:递归提取(结构不固定时使用)
如果对象的嵌套结构可能发生变化(比如products里可能还有更深的嵌套,或者某些层级数组长度不确定),可以用递归函数遍历所有属性收集id:
function extractIds(target) { let ids = []; for (const key in target) { if (typeof target[key] === 'object' && target[key] !== null) { if (key === 'id') { ids.push(target[key]); } else { ids = ids.concat(extractIds(target[key])); } } } return ids; } const ids = extractIds(obj); // 结果:["123", "456", "987", "654"]
这种方法通用性最强,不管对象嵌套多深,只要存在id属性就会被收集。
内容的提问来源于stack exchange,提问作者physicsboy
相关产品推荐
相关产品推荐

