函数中return 无法退出函数的问题

366 阅读1分钟

函数中return 无法退出函数的问题

1.发现并解决问题

在函数中,一般return就会退出函数,然而今天上班遇到了一个问题,就是return 不退出函数。 我想要从一个数组中获取我想要的oid,但是打印出来undefind,我发现它是进入了if (id === searchId)这个判断条件的,但是下面的条件也有执行,那我就不让他执行好了,给下面条件改为if (!result&&child && child.length > 0) ,这样就可以获取到正确的oid了。问题是解决了,但是不太清楚怎么产生的。

2.查找问题的根源

这是因为递归函数相当于是一层一层的函数嵌套在一起,所以其中的一个return只是但是那一层函数的返回,只是退出了当前层函数。 代码如下:

    const obj = [
      {
        id: 96,
        child: [
          {
            id: 92,
            oid: '222221',
            child: [
              {
                id: 168,
                oid: '222222',
                child: [
                  {
                    id: 91,
                    oid: '222223',
                    child: [
                      {
                        id: 93,
                        oid: '222224',
                        child: [
                          {
                            id: 94,
                            oid: '222225',
                          }],
                      }]
                  }],
              }]
          },
          {
            id: 101,
            oid: '222231',
            child: [
              {
                id: 160,
                oid: '222232',
                child: [
                  {
                    id: 191,
                    oid: '222233',
                  }],
              }]
          },

        ]
      }
    ]
    
    function searchById(list, searchId) {
      let result;
      for (let i = 0; i < list.length; i++) {
        const { id, child, oid} = list[i];
        if (id === searchId) {
          result =  oid;
          // console.log(result,1);
          return result
        }
        if (child && child.length > 0) {
          const res = searchById(child, searchId);
          result = res;
          // console.log(result,2);
        }
      }
      // // console.log(result,123);
      return result;
    }
    
  console.log(searchById(obj[0].child, 168))