4

たとえば、次のコードがあります。

var Foo = [1,2,3,4];

function searchInFoo(n) {
    for(var i = 0, arrayLength = Foo.length; i < arrayLength; i++) {
        if(Foo[i] === n) {
            console.log("N: " + n + " found!");
        } else {
            console.log("N: " + n + " not found!");
        }
    }
}


searchInFoo(4);

さて、私が期待していたように、 n 個の要素を持つ Foo 配列には、 for ループの n 回の繰り返しもあります。カッコいい。したがって、任意の n パラメータを指定して searchInFoo 関数を呼び出すと、関数は if else ステートメント内のすべてのブロックも n 回実行します。たとえば、上の例では、「n found」を 1 回ログに記録し、「N: n not found!」を 3 回ログに記録しました。

基本的なエラーキャッチ機能を失うことなく、elseブロックでの実行を回避するための最良のアプローチは何ですか?ここのようにelseブロック全体を省略すると実際に何が起こりますか:

var Foo = [1,2,3,4];

function searchInFoo(n) {
    for(var i = 0, arrayLength = Foo.length; i < arrayLength; i++) {
        if(Foo[i] === n) {
            console.log("N: " + n + " found!");
        } 
    }
}


searchInFoo(1);
4

1 に答える 1

4

この場合、ループは必要ありません。

var foo = [1,2,3,4];

function searchInFoo(n) {
    if(foo.indexOf(n) > -1) {
        console.log("N: " + n + " found!");
    } 
}
searchInFoo(1);

注: 変数名は大文字にしないでください。コンストラクター関数にはそのまま残してください。

または、さらに簡単に:

function searchInFoo(n) {
    return foo.indexOf(n) > -1;
}
console.log(searchInFoo(1) ? 'found' : 'not found');

forEachあなたの質問をもう一度読むと、 and map(MDN で利用可能なポリフィル)のような、より一般的なものを探していると思います。与えられた配列を反復処理し、各アイテムに対して関数を実行する関数はどうですか?

function myforeach(arr, fn) {
    for(var i=0; i<arr.length; i++) {
        fn(arr[i]);
    }
}
myforeach([1,2,3], function(el) {
    console.log(el === 1);
}); // logs true, false, false

カスタムmap関数は非常に似ています:

function mymap(arr, fn) {
    var retArray = [];
    for(var i=0; i<arr.length; i++) {
        retArr.push(fn(arr[i]));
    }
    return retArray;
}
var validated = myforeach([1,2,3], function(el) {
    return el === 1;
}); // returns [true, false, false]
于 2013-10-04T23:13:54.247 に答える