1. ホーム
  2. javascript

[解決済み] Javascriptの.filter()メソッドでコールバック関数に追加パラメータを渡すにはどうすればよいですか?

2022-08-31 23:01:03

質問

配列の各文字列を、指定された文字列と比較したい。私の現在の実装は、次のとおりです。

function startsWith(element) {
    return element.indexOf(wordToCompare) === 0;
}
addressBook.filter(startsWith);

この単純な関数が動作するのは、今現在は という単語を比較するためです。 がグローバル変数として設定されているからです。もちろん、これを回避してパラメータとして渡したいのです。問題なのは startsWith() を定義して、それが1つの追加パラメータを受け入れるようにする方法がわからないということです。なぜなら、それが受け取るデフォルトのパラメータがどのように渡されるかがよくわからないからです。私は、私が考えることができるすべての異なる方法を試してみましたが、それらのどれも動作しません。

組み込みの」コールバック関数 (申し訳ありませんが、これらのためのより良い用語を知りません) に渡されたパラメータがどのように動作するかを説明できれば、それは素晴らしいことです。

どのように解決するのですか?

作る startsWith は比較する単語を受け入れるようにし 関数を返す を返し、それがフィルタ/コールバック関数として使われます。

function startsWith(wordToCompare) {
    return function(element) {
        return element.indexOf(wordToCompare) === 0;
    }
}

addressBook.filter(startsWith(wordToCompare));

もう一つの方法として Function.prototype.bind [MDN] (ECMAScript5をサポートするブラウザでのみ利用可能。古いブラウザ用のシムはリンクを参照) と、第一引数を "fix" とします。

function startsWith(wordToCompare, element) {
    return element.indexOf(wordToCompare) === 0;
}

addressBook.filter(startsWith.bind(this, wordToCompare));


デフォルトのパラメータがどのように渡されるのかがよくわかりません。

特別なことは何もありません。ある時点で filter はコールバックを呼び出して配列の現在の要素を渡しているだけです。つまり、これは関数が別の関数、この場合は引数として渡したコールバックを呼び出すということです。

似たような関数の例です。

function filter(array, callback) {
    var result = [];
    for(var i = 0, l = array.length; i < l; i++) {
        if(callback(array[i])) {  // here callback is called with the current element
            result.push(array[i]);
        }
    }
    return result;
}