递归返回数组的元素

时间:2015-10-26 11:00:11

标签: javascript recursion return

就像好奇心一样,是否有可能在递归迭代期间返回数组元素?

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"

4 个答案:

答案 0 :(得分:1)

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

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()改变了原始数组。小心使用此功能

答案 1 :(得分:1)

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进行翻译。

答案 2 :(得分:1)

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 :(得分:0)

我不认为这里需要递归,如果你想返回一个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'