【问题标题】:recursion return element of array递归返回数组元素
【发布时间】:2016-01-25 10:52:30
【问题描述】:

出于好奇,是否可以在递归迭代期间返回数组的元素?

var index = 0;
function iterArray(arr){
    if(arr && index <= arr.length ){
        console.log(arr[index]); //Wanted to return this value instead calling any function here
        index++
        iterArray(arr)
    }
}

注意:- 上面的代码不会像我预期的那样执行。但我希望它应该像arr.pop 那样工作。喜欢:

k = ["a", "b", "c"];
ret1 = iterArray(k);
ret2 = iterArray(k);
ret3 = iterArray(k);
console.log(ret1, ret2, ret3)//"a", "b", "c"

【问题讨论】:

  • return (arr[index]); 也许...?
  • 想要的ret值和函数逻辑是什么?
  • @kriggs - 剩下的代码呢,它会执行吗?
  • return 之后的代码不会执行。
  • @Andrey - 对不起,我错了,请检查更新的代码

标签: javascript recursion return


【解决方案1】:

我认为这里不需要递归,如果你想返回 function 然后重新运行 function 你可以根据框架使用 setTimeout,在浏览器中可以正常工作。

var index = 0;
function iterArray(arr, index){
    if(arr && index <= arr.length ){
        index++;
        setTimeout( fucntion(){iterArray(arr, index);^, 10 ); // Index is a global var, why you're passing it?
        return (arr[index]);
    }
}

这将继续递归,但只会返回第一个匹配项。要通过您的示例完成您要完成的工作,AFAIK 的最佳方法是模仿一个类:

function nextIndexContainer( arrayToStore ){
   // Make a copy so it doesn't get changed on the fly, or remove the JSON's if this behaviour is desireable
   this.array = JSON.parse( JSON.stringify( arrayToStore ) ); 
   this.index = 0;

   this.next = function(){
      if( this.array[ this.index ] )
         return this.array[ this.index++ ];
      else
         return 'Last index reached';
   }
}

使用它:

var arrIndex = new nextIndexContainer([1, 5, 8]);
console.log(arrIndex.next()); // '1'
console.log(arrIndex.next()); // '5'
console.log(arrIndex.next()); // '8'
console.log(arrIndex.next()); // 'Last index reached'

【讨论】:

    【解决方案2】:
    Function recurseOverArrayLookingForValue(array, value, currentIndex){
    if (currentIndex == undefined)
    { 
       currentIndex = 0;
    }
    if (currentIndex >= array.length)
    {
        Return -1; //not found
    }
    if (array[currentIndex] == value){
        return currentIndex;
    }
        RecurseOverArrayLookingForValue(array,value,currentIndex);
    }
    

    这将递归地遍历一个数组并返回一个与输入匹配的值。您在不定义 currentIndex 的情况下调用它,它将从开头开始并递归到结尾,或者您可以定义它并从那里递归。

    关于递归的事情是你必须有一个预定义的退出状态,这将导致函数终止执行。否则,基本上你会得到一个无限循环。所以在你的例子中,你需要定义一些理由来返回该索引中的值,或者继续递归,直到你到达数组的末尾,此时你应该再次退出函数 - 这就是我选择的原因添加查找值逻辑。如果您不是在寻找特定值,那么您需要定义另一个退出返回给定值的原因。可能会调用另一个函数,根据您需要的数字或它是否满足某些条件来返回 true ilor false。否则,您的退出状态将始终是数组的末尾。

    【讨论】:

      【解决方案3】:

      Array.pop 不需要递归实现。

      但如果是一般性问题 - 我会考虑一些 ECMAScript 6 生成器。

      function* iterArray(arr, idx) {
        yield arr[idx];
        yield* iterArray(arr, ++idx);
      }
      
      var arr = [1,2,3];
      
      var g = iterArray (arr, 0);
      console.log(g.next().value);
      console.log(g.next().value);
      console.log(g.next().value);
      

      使用生成器很容易,但是在 ES5 环境中做类似的事情 - 你需要转译这段代码,或者手动实现类似的机制。

      P.S:我使用babel 进行转译。

      【讨论】:

      • 这就是我要找的。谢谢
      【解决方案4】:

      此函数可用于搜索数组中存在的键

      function iterArray(arr){
          if(arr instanceof Array && arr.length) {        
              return arr.shift();        
          };  
      }
      
      
      k = ["a", "b", "c"];
      ret1 = iterArray(k);
      ret2 = iterArray(k);
      ret3 = iterArray(k);
      console.log('ret1 '+ ret1 + ' ret2 '+ ret2 + ' ret3 ' + ret3);
      

      但是,函数 iterArray() 改变了原始数组。请谨慎使用此功能

      【讨论】:

      • 感谢您的帮助,但我正在通过递归迭代查找此输出。如您所示,有很多方法可以做到这一点。
      猜你喜欢
      • 2022-11-23
      • 2018-09-10
      • 1970-01-01
      • 2016-01-24
      • 2018-10-25
      • 1970-01-01
      • 1970-01-01
      • 2021-07-23
      • 2015-10-23
      相关资源
      最近更新 更多