就像好奇心一样,是否有可能在递归迭代期间返回数组元素?
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"
答案 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'