2017-08-31 7 views
0
var animals = ["cat","dog","fish"]; 
var lengths = animals.map(function(c) { 
    return c.length; 
}); 
console.log(lengths);//[3, 3, 4] 

ここにコードがあります。私はこの 'c'引数がどこから来るのか分かりません。 この引数を別のものに変更しようとしましたが(実際にはどちらの単語でも)、console.logの結果は常に同じです!配列要素にはデフォルトでJavaScriptに名前がありますか?

しかし、この 'c'はどこにも定義されていません! 「エンジン」はこの「c」の価値をどこから得ていますか?

+0

「.map」はループ内の各要素を取ります。これらの要素は変数cに入っています。その変数には何でも名前を付けることができます。 – Shubham

+0

'c'は配列の各項目で、' map() 'に渡す' function'の最初のパラメータとして渡されます。 – haim770

+0

'.map'は' callback'関数を期待しています。この関数は3つの引数、['currentElement'、' index'、 'array']をとります。だから、あなたが何を名を挙げても、それはこの順序でしかないでしょう。 – Rajesh

答えて

4

あなたはここで、パラメータが呼び出されたかインタプリタを言っている:

function(c) { 
     ^

Array.prototype.map()は3つのまでのパラメータを受け入れ、コールバックを必要とします。最初のパラメータは常に「現在のアイテム」です。その名前はcです。

詳細については、T.J. Crowders answerをご覧ください。

5

あなたは2つの少し異なる質問をしました。最初に質問の本文に:

この 'c'引数の由来はわかりません。私はこの引数を別のものに変更しようとしましたが(実際には、両方の場所で単語があります)、console.logの結果は常に同じです!

しかし、この 'c'はどこにも定義されていません! 「エンジン」はこの「c」の値をどこから取得しますか?

あなたは(あなたが気づいたように、あなたが好きそれのために任意の名前を選択することができます)パラメータ名を定義mapはコールバックを呼び出し、そのパラメータに渡す引数を決定するため、値は配列から取得されます。配列要素は、JavaScriptで、デフォルトで名前を持っていますか

// CONCEPTUAL ONLY, NOT AN ACTUAL VERSION OF IT 
 
function maplike(array, callback) { 
 
    var result = []; 
 
    for (var i = 0; i < array.length; ++i) { 
 
     result[i] = callback(array[i]); 
 
     //     ^^^^^^^^--- where 'c' comes from 
 
    } 
 
    return result; 
 
} 
 

 
var animals = ["cat","dog","fish"]; 
 
var lengths = maplike(animals, function(c) { 
 
    return c.length; 
 
}); 
 
console.log(lengths);//[3, 3, 4]

はここで、これは明確に作るArray.prototype.map概念 implementaton、ですか?

あなたが考えている方法ではありません。要素の名前は0,などです。実際、JavaScript配列aren't really arrays at all *とそれらのインデックスは文字列プロパティ名に変換されます(理論的には実際にはJavaScriptエンジンによって最適化されます)。


* (開示:それは私の貧血の小さなブログの記事です)JavaScriptで

0

、機能は、彼らが、変数に割り当てられた機能のパラメータとして渡された値から返すことができることを意味する、first class objectあります。 Array.prototype.map関数は、配列の項目を示す最初のパラメータを持つ関数をとります。呼び出されると、map関数はそれぞれの項目に対して与えられた関数を実行し、与えられた関数の出力から新しい配列を作成します。

あなたの場合、マップ関数内で入力関数をオンザフライで定義しています。

実際には、関数を外部に定義し、関数を以下のようにマップ内の参照で渡すことができます。

function getLength(item) { 
    return item.length; 
} 

var animals = ["cat","dog","fish"]; 
var lengths = animals.map(getLength); 

console.log(lengths);//[3, 3, 4] 

ここでは、同じ結果が出力されていることがわかります。

0

コードでは、指定されたパラメータが何であるかわかりません。配列をマップします。 map関数は、lengths変数に新しい配列を作成します(変数は割り当てられます)。どうやって?現在の配列内の各要素を値ごとに1つずつ関数パラメータに渡します。 値は実際の文字列名( "cat"または "dog"または "fish")です。

JavaScriptでは、パラメータはオプションです。このマップ関数は、currentValue、index、arrayという3つのパラメータを取ることができます。あなたの場合、cは現在の値を提供します。 パラメータc、idxをもう1つ追加する場合。マップ関数は、現在の値とその内部のインデックスを取得します。

var animals = ["cat","dog","fish"]; 
var lengths = animals.map(function(c, idx, arr, test) { 
    console.log(c); // currentvalue being processed in the array. 
    console.log(idx); // index of currentvalue in the array 
    console.log(arr); // original array being operated on. 
    console.log(test); // undefined always. not available in map. 
    return c.length; 
}); 
console.log(lengths);//[3, 3, 4] 
+0

これは、 "map関数は、length変数(割り当てられる変数)に新しい配列を作成する"という意味です。私は上にも固定されています。現在の配列で渡されています。 – Amit

+0

ええと、私は脳の一部を持っていた。私が前に言ったことを無視してください。 – Cerbrus

関連する問題