JavaScript递归识别嵌套对象最后一个文本元素并追加内容
实现方案
核心思路
我们要找的是整个嵌套结构里顺序最靠后的text节点,因此直接从最外层的content数组倒序遍历,每次优先检查当前元素的最后一项,找到目标就立即终止遍历,不用遍历全量结构,性能更高:
- 如果当前项有
text属性,说明它就是要找的末尾节点,直接修改文本后终止递归即可 - 如果当前项有
content属性,就递归进入该content继续查找,找到目标直接返回终止,不需要再检查前面的元素
实现代码
function appendFlagToLastText(obj) { // 递归查找函数,返回true表示已找到目标,终止后续遍历 function findLast(node) { // 处理content数组的情况,从最后一项倒序检查 if (Array.isArray(node.content)) { for (let i = node.content.length - 1; i >= 0; i--) { const child = node.content[i]; // 当前子项有text属性,直接修改返回 if (child.text !== undefined) { child.text += ' - last item'; return true; } // 当前子项有content属性,递归查找 if (child.content !== undefined) { const found = findLast(child); if (found) return true; } } } // 单个节点直接带text属性的边界情况处理 if (node.text !== undefined) { node.text += ' - last item'; return true; } return false; } findLast(obj); return obj; }
测试验证
示例1测试
const obj1 = { content: [ { text: "paragraph 1" }, { content: [ { text: "paragraph 2" }, ] }, { text: "paragraph 3" }, ] }; appendFlagToLastText(obj1); console.log(obj1.content[2].text); // 输出:paragraph 3 - last item
示例2测试
const obj2 = { content: [ { text: "paragraph 1" }, { content: [ { text: "paragraph 2" } ] }, { text: "paragraph 3" }, { content: [ { text: "paragraph 4" }, { content: [ { text: "paragraph 5" } ] } ] } ] }; appendFlagToLastText(obj2); console.log(obj2.content[3].content[1].content[0].text); // 输出:paragraph 5 - last item
说明
- 代码默认直接修改原对象,如果需要保留原对象,可在递归前先对入参做深拷贝处理
- 支持任意层数的
content嵌套,不受嵌套深度限制 - 仅最末尾的1个text节点会被追加标记,符合需求
内容的提问来源于stack exchange,提问作者user1452009
相关产品推荐
相关产品推荐

