js跳出forEach循环

来自《JavaScript权威指南(6版)》7.9.1 的描述:

注意,forEach()无法在所有元素都传递给调用的函数之前终止遍历。也就是说,没有像for循环中使用的相应的break语句。如果要提前终止,必须把forEach()方法放在一个try块中,并能抛出一个异常。如果forEach()调用的函数抛出foreach.break异常,循环会提前终止:

function foreach (a, f, t) {
    try { a.forEach (f, t); }
    catch (e) {
        if (e === foreach.break) return;
        else throw e;
    }
}

foreach.break = new Error("StopIteration");

将其添加到Array的prototype上:

Array.prototype.myForEach = function (f, t) {
    var a = this;
    try { a.forEach (f, t); }
    catch (e) {
        if (e == 'break') return;
        else throw e;
    }
}

栗子:

//返回min,max之间的数组成的数组,无序
function getArr(min,max){
    if(typeof min!=='number'||typeof max !== 'number') return [];
    var arr = [];
    for (var i = min; i <= max; i++) {
        if (arr.length<1) {
            arr.push(i);
        }else{
            var len = arr.length;
            var rIndex = Math.round(Math.random()*(len-1));
            var temp = arr[rIndex];
            arr[rIndex] = i;
            arr.push(temp);
        }
    }
    return arr;
}

getArr(1,20).myForEach(function (v, i) {
    console.log(i + ' -> ' + v);
    if (i == 10) throw 'break';
});

自定义forEach方法:

Array.prototype.myForEach = function (func) {
    var arr = this;
    for (var i = 0; i < arr.length; i++) {
        var ret= func(arr[i], i);//回调函数
        if (typeof ret !== "undefined" && (ret == null || ret == false)) break;
    }
}

使用every()和some()代替:

['a', 'b', 'c'].every(function(element, index) {
    // Do your thing, then:
    if (you_want_to_break) return false
    else return true
})

你可能感兴趣的:(javascript)