尝试在树javascript中递归查找元素

尝试在树javascript中递归查找元素,javascript,Javascript,我试图弄清楚如何在json树中递归搜索元素。例如,我现在正试图达到'水果',但不知道如何做到这一点。这是我的json对象 [ { "_id": "604cab0acbdb8c1060698419", "name": "Grocery", "children": [ { "chi

我试图弄清楚如何在json树中递归搜索元素。例如,我现在正试图达到'水果',但不知道如何做到这一点。这是我的json对象

[
    {
        "_id": "604cab0acbdb8c1060698419",
        "name": "Grocery",
        "children": [
            {
                "children": [
                  {
                    "name": "Fruits",
                    "price": "200"
                    
                  }
                  ],
                "_id": "604cad9b4ae51310c6f313f6",
                "name": "Potatoes",
                "price": "200"
            },
            {
                "children": [],
                "_id": "604cae721257d510e679a467",
                "name": "Vegetables"
            }
        ],
        "date": "2021-03-13T12:07:38.186Z",
        "__v": 0
    } ]



function findName(name, tree) {
    if(tree.children.name == name {
        return tree;
    }

    if(tree.child == 0) {
        return
    }

    return findName(name, tree);
};

您的实现有几个问题

  • 您的起点是一个数组,但通过尝试使用其
    子属性
    将其视为节点
  • 您正在
    子项
    上查找
    名称
    ,但
    子项
    是一个数组
  • 您在接收的末尾将相同的内容传递到
    findName
    。如果达到这一点,您将不断调用自己,直到堆栈空间用完为止
  • 循环遍历数组中的节点,检查它们及其子节点;见评论:

    function findName(name, children) {
        if (Array.isArray(children)) {
            // Yes, check them
            for (const childNode of children) {
                if (childNode.name === name) {
                    // Found it
                    return childNode;
                }
                // Look in this node's children
                const found = findName(name, childNode.children);
                if (found) {
                    // Found in this node's children
                    return found;
                }
            }
        }
    }
    
    实例:

    const树=[
    {
    “_id”:“604cab0acbdb8c1060698419”,
    “名称”:“杂货店”,
    “儿童”:[
    {
    “儿童”:[
    {
    “名称”:“水果”,
    “价格”:“200”
    }
    ],
    “_id”:“604cad9b4ae51310c6f313f6”,
    “名称”:“土豆”,
    “价格”:“200”
    },
    {
    “儿童”:[…],
    “_id”:“604cae721257d510e679a467”,
    “名称”:“蔬菜”
    }
    ],
    “日期”:“2021-03-13T12:07:38.186Z”,
    “_v”:0
    } ];
    函数findName(名称、子级){
    if(数组.isArray(子数组)){
    //是的,检查一下
    for(子节点的const childNode){
    if(childNode.name==name){
    //找到了
    返回子节点;
    }
    //查看此节点的子节点
    const found=findName(名称,childNode.children);
    如果(找到){
    //在此节点的子节点中找到
    发现退货;
    }
    }
    }
    }
    
    console.log(findName(“水果”,tree))您的实现存在几个问题

  • 您的起点是一个数组,但通过尝试使用其
    子属性
    将其视为节点
  • 您正在
    子项
    上查找
    名称
    ,但
    子项
    是一个数组
  • 您在接收的末尾将相同的内容传递到
    findName
    。如果达到这一点,您将不断调用自己,直到堆栈空间用完为止
  • 循环遍历数组中的节点,检查它们及其子节点;见评论:

    function findName(name, children) {
        if (Array.isArray(children)) {
            // Yes, check them
            for (const childNode of children) {
                if (childNode.name === name) {
                    // Found it
                    return childNode;
                }
                // Look in this node's children
                const found = findName(name, childNode.children);
                if (found) {
                    // Found in this node's children
                    return found;
                }
            }
        }
    }
    
    实例:

    const树=[
    {
    “_id”:“604cab0acbdb8c1060698419”,
    “名称”:“杂货店”,
    “儿童”:[
    {
    “儿童”:[
    {
    “名称”:“水果”,
    “价格”:“200”
    }
    ],
    “_id”:“604cad9b4ae51310c6f313f6”,
    “名称”:“土豆”,
    “价格”:“200”
    },
    {
    “儿童”:[…],
    “_id”:“604cae721257d510e679a467”,
    “名称”:“蔬菜”
    }
    ],
    “日期”:“2021-03-13T12:07:38.186Z”,
    “_v”:0
    } ];
    函数findName(名称、子级){
    if(数组.isArray(子数组)){
    //是的,检查一下
    for(子节点的const childNode){
    if(childNode.name==name){
    //找到了
    返回子节点;
    }
    //查看此节点的子节点
    const found=findName(名称,childNode.children);
    如果(找到){
    //在此节点的子节点中找到
    发现退货;
    }
    }
    }
    }
    console.log(findName(“水果”,tree))
    
    const对象=[
    {
    “_id”:“604cab0acbdb8c1060698419”,
    “名称”:“杂货店”,
    “儿童”:[
    {
    “儿童”:[
    {
    “名称”:“水果”,
    “价格”:“200”
    }
    ],
    “_id”:“604cad9b4ae51310c6f313f6”,
    “名称”:“土豆”,
    “价格”:“200”
    },
    {
    “儿童”:[…],
    “_id”:“604cae721257d510e679a467”,
    “名称”:“蔬菜”
    }
    ],
    “日期”:“2021-03-13T12:07:38.186Z”,
    “_v”:0
    } ]
    函数查找(名称、树){
    //树未定义,返回“未定义”(基本大小写)
    如果(!tree)返回
    if(数组.isArray(树)){
    //树是一个数组
    //所以迭代数组中的每个对象
    for(设i=0;i
    const对象=[
    {
    “_id”:“604cab0acbdb8c1060698419”,
    “名称”:“杂货店”,
    “儿童”:[
    {
    “儿童”:[
    {
    “名称”:“水果”,
    “价格”:“200”
    }
    ],
    “_id”:“604cad9b4ae51310c6f313f6”,
    “名称”:“土豆”,
    “价格”:“200”
    },
    {
    “儿童”:[…],
    “_id”:“604cae721257d510e679a467”,
    “名称”:“蔬菜”
    }
    ],
    “日期”:“2021-03-13T12:07:38.186Z”,
    “_v”:0
    } ]
    函数查找(名称、树){
    //树未定义,返回“未定义”(基本大小写)
    如果(!tree)返回
    if(Array.isArray)