JavaScript如何从嵌套键值对数组合成完整姓名字符串数组
嵌套数组姓名提取实现
为什么之前递归的写法输出不对
你之前的递归没有做层级边界判断:最外层数组的每一个子项,对应最终结果里的一条完整姓名字符串。你写的递归碰到拆到的原始字符串值(比如Mary、Jenkins)就直接往最终数组里塞,没等同一条记录的所有姓名片段收集完就提前推值,自然就得到了把所有值拆碎的扁平数组。
固定结构极简实现
你给出的数组层级是完全固定的,根本不需要上递归,几行代码就能搞定:
const result = list.map(record => // 单条记录里的所有键值对,直接取第二个元素的值,空格拼接后就是完整姓名 record.map(([, val]) => val).join(' ') )
运行输出为['Mary Jenkins', 'Kim', 'Joe'],和你期望的结构完全匹配。
通用递归实现(适配未知嵌套深度)
如果需要兼容不确定嵌套层级的通用结构,递归逻辑一定要加单条记录的识别规则,不能无差别拆所有值:
- 遍历当前层的每个元素,先判断当前层是不是单条用户记录:也就是层内所有子元素都是
[字段名, 字段值]格式的二元数组 - 确认是单条记录后,把这条记录里的所有字段值拼接成完整字符串推入最终结果,不再继续向下拆分
- 如果当前层还是记录集合(子元素也是数组),就继续递归遍历每个子元素
function extractNames(source) { const res = [] for (const item of source) { // 单条记录结构判断 const isRecord = Array.isArray(item) && item.length > 0 && item.every(sub => Array.isArray(sub) && sub.length === 2 && typeof sub[0] === 'string') if (isRecord) { res.push(item.map(kv => kv[1]).join(' ')) } else if (Array.isArray(item)) { res.push(...extractNames(item)) } } return res } const result = extractNames(list)
内容的提问来源于stack exchange,提问作者Loolii
相关产品推荐
相关产品推荐

