You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:34:44