const a = [1,2,5,10]; const b = a.map(function(item){ return item * 2; }); console.log(b);//[2, 4, 10, 20]
リターンの部分なのですが、
どこに値を返しているのかイメージできません。
もし、わかりやすく説明できる方がいれば教えて下さい。
なんとなくのイメージだと
↓こんな感じだと思ったのですがundefindでした汗。
class Class { mapp(callback){ callback('name');} } let d = new Class(); let c = d.mapp(function(item){ return item; }); console.log(c);//undefind
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/01/16 06:04
回答2件
0
ベストアンサー
Array.prototype.mapの中身はだいたいこのような挙動になっています。
JavaScript
1function map (items, callback) { 2 var results = []; 3 for (var i = 0; i < items.length; i++) { 4 var item = items[i]; 5 var result = callback(item, i, items); 6 results.push(result); 7 } 8 return results; 9} 10 11function add2 (num) { 12 return num + 2; 13} 14console.log(map([1, 2, 3], add2)); // [3, 4, 5] 15console.log([1, 2, 3].map(add2)); // [3, 4, 5] 16 17// ES6仕様 18const amap = (items, callback) => { 19 const results = []; 20 for (let i = 0; i < items.length; i++) { 21 const item = items[i]; 22 const result = callback(item, i, items); 23 results.push(result); 24 } 25 return results; 26} 27 28const aadd2 = it => it + 2; 29console.log(amap([1, 2, 3], aadd2)); // [3, 4, 5] 30console.log([1, 2, 3].map(aadd2)); // [3, 4, 5]
もうまんまこれなので、ゆっくりでも良いので反芻して飲み込んでください。
mapというのは数学用語の写像で、
配列を集合、関数を公式に見立てただけのまんまそれです。
工場でラインに乗って流れてきたモノを上からぎゅーってプレス加工して大量生産するのもmapと言うそうですよ。
リターンの部分なのですが、どこに値を返しているのかイメージできません。
result = callback(item, i, items);
の部分に着目してください。
mapは配列の全ての要素に同じ関数を適用し、その戻り値を使って新しい配列を作っています。
ですので、戻り値を返さない関数だとundefinedの配列になってしまいます。
JavaScript
1var result = [1, 2, 3].map(function (it) { 2 it + 2; // 四則演算を行うが何もreturnしていない 3}) 4 5// ES6仕様 6const aresult = [1, 2, 3].map(it => { 7 it + 2; // 四則演算を行うが何もreturnしていない 8}); 9console.log(aresult); // [undefined, undefined, undefined]
投稿2019/01/16 04:50
編集2019/01/16 06:14総合スコア21158
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/01/16 06:03
2019/01/16 06:19
退会済みユーザー
2019/01/16 06:27
2019/01/16 06:32
退会済みユーザー
2019/01/16 07:27
退会済みユーザー
2019/01/16 09:12
退会済みユーザー
2019/01/16 13:48
2019/01/16 14:12 編集
退会済みユーザー
2019/01/16 14:39
退会済みユーザー
2019/01/16 14:42
2019/01/16 14:50
退会済みユーザー
2019/01/16 14:56
0
最初のコード例を、リターンが分かりそうな感じに書きかえてみました。
javascript
1const mapping = function(ar, func) { 2 let ret = []; 3 for(let i = 0; i < ar.length ; i++) { 4 ret.push(func(ar[i])); // ここで受けてる 5 } 6 return ret; 7} 8const double = function( a) {return a * 2;} //ここでのリターンを↑ 9 10const a = [1,2,5,10]; 11const b = mapping(a, double);
もっと手前のはなしをしたほうがいいのかと思うのでポエムをかきます
エクセルは使ったことありますか?なければgoogleスプレッドシートはありますか(こちら無料なので使ってみてください)?
A | B | C | D |
---|---|---|---|
1 | 2 | 5 | 10 |
=A1*2 | =B1*2 | =C1*2 | =D1*2 |
こういうのを想像してください(エクセルになじみがなかったら↑のとおり入れてください)
A2:D2にかいてるのはfunction(a) { return a * 2; }
みたいなやつです。
mapによるいわゆる射影/写像という処理は、1行目の配列を2行目の状態にするものです。
jsでmapがcallback(関数の実体)をもらうというのは、excelみたいに、意味的に同じことを何回も入力(コピペ)しなくても、要素に順に適用していってくれるということです。
なので、「何にリターンしているか」という当初の質問については、やや不正確ですが、mapで得る結果配列のなかで、処理する対象となる要素のindex番目と同じ(配列上の)位置にリターンしている、という感じですかね(イメージ先行の説明をしています)
→上の例だとB2の関数は、B2セルにリターンしています。
投稿2019/01/16 04:57
編集2019/01/16 06:37総合スコア12705
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/01/16 06:03
2019/01/16 06:28
退会済みユーザー
2019/01/16 07:07 編集
2019/01/16 07:15
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。