jsからforEachサイクルが飛び出す

4847 ワード

「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");
Arayのプロトタイプに追加します.
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
})