質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

907閲覧

mapメソッドを使い配列の要素の個数だけインスタンスを作りたい

k0908

総合スコア102

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2018/05/16 09:11

編集2018/05/16 09:26

mapメソッドを使い配列の要素の個数だけインスタンスを作りたい。

var arr=[[1,2],[3,4],[5,6]]; function A(){ for (var i = 0; i < arr.length-1; i++) { this.a=arr[I]; } } var ans=arr.map(function(arr){ return new A(arr); }); console.log(ans);

とコードを書いた。
console.logで、

[ { "a": [ 3, 4 ] }, { "a": [ 3, 4 ] }, { "a": [ 3, 4 ] } ] [ { "a": [ 3, 4 ] }, { "a": [ 3, 4 ] }, { "a": [ 3, 4 ] } ] [ { "a": [ 3, 4 ] }, { "a": [ 3, 4 ] }, { "a": [ 3, 4 ] } ]

と出力が出た。

理想のアウトプットは、

[new A(1,2),new A(3,4), new A(5,6)]

のように出力することである。
何が問題で[ 3, 4 ]しか取れないのか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

  • 何が問題で[ 3, 4 ]しか取れないのか?

に対して、コードよりも解説を補足させてください。場所を特定する必要から引用します。

javascript

1var arr=[[1,2],[3,4],[5,6]]; 2function A(){ 3 for (var i = 0; i < arr.length-1; i++) { //*2 4 this.a=arr[I];//*3 5 } //*4 6} 7 8var ans=root.map(function(arr){ //*0 9 return new A(arr); // *1 10}); 11 12console.log(ans);
  1. *0のrootはエラーになるはずです(これがコードの全てであれば)
  2. forの位置がやりたいことに適していません。

1のところで、関数Aが呼び出されますが、その都度2のループが走ります。もともとmapが配列の全要素にコールバックを順次適用する機能を持ちますので、例えばroot.mapではなくarr.mapと書いておられたとしたら、mapが3要素に処理をするそれぞれのパターンでA()が2回のループをかけることになり、結果として*3は述べ6回実行されることになります。
言い換えれば、*1が一回走るごとに、*3が2回実施されます。
このとき、*3は同じ変数(this.a)を上書きしていますので2回目の結果である[ 3, 4 ]が保存されることになります。
そして、*1がmapによって繰り返されますので(出力サンプルからするとrootが9要素持っているのかもしれません)、そのmapの回数文だけA{a:[3,4]}が作られる、ということになろうかと思います。

投稿2018/05/16 09:36

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

↓この回答のとおり書いて、余計なコードを挟まなければいいかと思いますよ。
JavaScript - データの数だけインスタンスを作成したい(126463)|teratail

投稿2018/05/16 09:36

Lhankor_Mhy

総合スコア36074

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

理想のアウトプットは、
[new A(1,2),new A(3,4), new A(5,6)]
のように出力することである。

質問文に掲載されているコードの中で、rootという変数がいきなり出てきているのでよく分からないですが、
以下のようなことをしたいのでしょうか?

const data = [ [1,2], [3,4], [5,6] ]; function A(a, b) { this.a = a; this.b = b; } const result = data.map(function(datum) { return new A(datum[0], datum[1]); }) console.log(result); // [ A { a: 1, b: 2 }, A { a: 3, b: 4 }, A { a: 5, b: 6 } ]

追記

何が問題で[ 3, 4 ]しか取れないのか?

Array.prototype.map()は内部で既にループ処理をしてくれています。

map()メソッドの動作は、雑ですがイメージ的には以下のmapModoki()メソッドのような感じです。

function A(a, b) { this.a = a; this.b = b; } const data = [ [1,2], [3,4], [5,6] ]; Array.prototype.mapModoki = function mapModoki(func) { let newArray = []; for (let i = 0; i < this.length; i++) { newArray.push(func(this[i])); } return newArray; } const result = data.mapModoki(function(datum) { return new A(datum[0], datum[1]) }); console.log(result) // [ A { a: 1, b: 2 }, A { a: 3, b: 4 }, A { a: 5, b: 6 } ]

投稿2018/05/16 09:18

編集2018/05/16 09:56
HayatoKamono

総合スコア2415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問