如何使用Lodash在嵌套JSON payload中查找指定ID的节点?
使用Lodash简化嵌套JSON节点查找
嘿,刚好我也常常用Lodash处理嵌套结构,完全懂你觉得自己写的函数太冗长的痛点!其实借助Lodash的几个内置方法,能把这个查找逻辑简化不少,不用自己写复杂的递归~
先把你给出的嵌套JSON结构贴出来方便参考:
{ "_expanded": true, "_canDrop": false, "_id": "-1", "_name": "root", "_children": [ { "_expanded": true, "_canDrop": false, "_id": "1", "_name": "Child 1", "_children": [ // 更深层子节点 ] } ] }
给你推荐两种简洁的实现方式:
方法一:扁平化后查找(最直观)
用_.flatMapDeep把所有嵌套节点递归扁平化到一个数组里,再用_.find直接匹配目标ID,逻辑一目了然:
const findTargetNode = (treeData, targetId) => { // 递归拉平所有节点,包含各级子节点 const allNodes = _.flatMapDeep(treeData, node => [node, ...(node._children || [])]); // 从拉平的数组中找到匹配_id的节点 return _.find(allNodes, { _id: targetId }); };
如果需要找到所有匹配ID的节点,把_.find换成_.filter就搞定了。
方法二:遍历过程中直接匹配(更高效)
如果你的嵌套结构特别深,扁平化可能有轻微性能开销,那可以用_.cloneDeepWith——它在深克隆的过程中会遍历每个节点,我们可以在遍历时检查ID,找到后直接返回,还能终止后续遍历:
const findTargetNode = (treeData, targetId) => { let targetNode = null; _.cloneDeepWith(treeData, node => { if (node._id === targetId) { targetNode = node; // 返回当前节点,终止后续克隆遍历 return node; } // 有子节点就继续遍历,返回undefined让方法处理子节点 return undefined; }); return targetNode; };
这两种方法都比手写递归简洁太多,而且都是Lodash原生支持的方法,稳定性也有保障~
内容的提问来源于stack exchange,提问作者Ruaghain
相关产品推荐
相关产品推荐

