【问题标题】:Finding a node with a given id in nested payload using lodash使用 lodash 在嵌套有效负载中查找具有给定 id 的节点
【发布时间】:2018-08-27 06:10:54
【问题描述】:

我有以下嵌套的 JSON 有效负载,我想对其进行迭代,并使用lodash 找到匹配的id 值(我显然仍在掌握lodash)。下面是有效负载的示例,以及我正在使用的函数 - 这似乎有点冗长。有没有更简单的方法来完成我所需要的?

JSON 负载:

{
  "_expanded": true,
  "_canDrop": false,
  "_id": "-1",
  "_name": "root",
  "_children": [
    {
      "_expanded": true,
      "_canDrop": false,
      "_id": "1",
      "_name": "Child 1",
      "_children": [
        {
          "_expanded": true,
          "_canDrop": false,
          "_id": "1-1",
          "_name": "Child 1-1",
          "_children": [
            {
              "_expanded": false,
              "_canDrop": false,
              "_id": "1-1-1",
              "_name": "Child 1-1-1",
              "_children": []
            }
          ]
        },
        {
          "_expanded": false,
          "_canDrop": false,
          "_id": "1-2",
          "_name": "Child 1-2",
          "_children": []
        },
        {
          "_expanded": false,
          "_canDrop": false,
          "_id": "1-3",
          "_name": "Child 1-3",
          "_children": []
        }
      ]
    },
    {
      "_expanded": true,
      "_canDrop": false,
      "_id": "2",
      "_name": "Child 2",
      "_children": [
        {
          "_expanded": false,
          "_canDrop": false,
          "_id": "2-2",
          "_name": "Child 2-2",
          "_children": []
        }
      ]
    }
  ]
}

功能:

  public findNode = (id: any): TreeNode => {
    let result = null;

    _.find(this._children, function(child) {
      if (child._id === id) {
        result = child;
      } else {
        if (child._children.length > 0) {
          _.find(child._children, function(item) {
            result = this.findNode(item._id);
          })
        }
      }
    });
    return result;
  }

【问题讨论】:

    标签: arrays json typescript lodash


    【解决方案1】:

    Lodash 没有任何与深度搜索相关的东西,所以你必须自己实现算法的树方面。

    您尝试使用的另外_.find 用于查找与谓词匹配的元素,但不允许您更改结果。它最多只能找到他或他的一个孩子拥有正确的根节点_id

    所以,这个算法必须手动编写:

    function findNode(id: any, node: any) {
        if (node._id === id) {
            return node;
        }
        for (const child of node._children) {
            const r = findNode(id, child);
            if (r !== undefined) {
                return r;
            }
        }
        return undefined;
    }
    

    如果你真的坚持要更“功能性”,你可以使用reduce来代替children上的for循环:

    return _.reduce(node._children, (result, child) => {
        if (result !== undefined) {
            return result;
        }
        return findNode(id, child);
    }, undefined)
    

    这基本上会遍历孩子并检查每个孩子,除非已经找到了一些东西

    【讨论】:

    • 抱歉@Zbigniew 回复晚了。做了类似于你上面的事情。不过谢谢你。
    • 没问题。一年左右我也遇到了与你类似的问题,所以当我看到你的问题时,很明显应该分享解决方案(或至少)提示。
    猜你喜欢
    • 2022-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多