🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

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

Q&A

解決済

3回答

1217閲覧

keyとvalue配列からオブジェクトを作るには。

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

0グッド

2クリップ

投稿2019/11/16 03:18

編集2019/11/16 04:04

keyとvalue配列からオブジェクトを作るには、
forで順番に入れていくしか無いのでしょうか?
もっと簡潔に書く方法はありますか?

javascript

1let key=["name","address","tel"]; 2let valuelist=[ 3 ["田中","日本","000000000"], 4 ["佐藤","日本","000000000"]]; 5 6let objlist=[]; 7for(i=0; i<2; i++){ 8 let obj=[]; 9 obj[key[0]] = valuelist[i][0]; 10 obj[key[1]] = valuelist[i][1]; 11 obj[key[2]] = valuelist[i][2]; 12 objlist.push(obj); 13}

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

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

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

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

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

kei344

2019/11/16 03:23

コードに全角記号が混じっているので、修正されてはいかがでしょう。
miyabi_takatsuk

2019/11/16 06:05

質問のコードを修正されたようですが、それだと、 obj[key[0]] = 〜...の時点でエラーが起きます。 なぜなら、for内のローカル変数objは、配列として宣言してるのに、 オブジェクトとしての代入をしようとしているからです。 スマホで質問されてるようですが、 PCにて、実際に動かしながらにした方がいいかと。 (出先なのかとは思いますが) コードが動いている上での、もっとこうしたい、という質問なので、恐縮ながらアドバイスさせていただきました。
guest

回答3

0

こんにちは

ベストアンサー決定後の回答、失礼します。
配列やオブジェクトの操作で便利なライブラリ lodash に _.zipObject というメソッドがあります。これを使って、

javascript

1const objlist = valuelist.map(v => _.zipObject(key, v));

とすると objlist が得られます。

別解

lodash を使わない案も挙げておきます。

まず、以下の2つの配列

  • [ "name", "address", "tel" ]
  • [ "田中", "東京", "000000000" ]

から、下記の配列

  • [ [ "name", "田中" ], [ "address", "東京" ], [ "tel", "000000000" ] ]

を得る関数を作ります。このような処理をする関数は、慣例的に zip と呼ばれるので、それに倣います。

javascript

1const zip = (ary1, ary2) => ary1.map((e, i) => [e, ary2[i]]);

上記の zip によって得られる
[ [ "name", "田中" ], [ "address", "東京" ], [ "tel", "000000000" ] ]
という形式の配列を

に渡せば、オブジェクトが作られます。以下はこれを使ったコードです。

javascript

1const objlist = valuelist.map(v => 2 Object.fromEntries(zip(key, v)) 3);

参考になれば幸いです。

投稿2019/11/16 07:50

編集2019/11/16 08:45
jun68ykt

総合スコア9058

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

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

0

ベストアンサー

繰り返し処理を二段階にすればいいのでは

javascript

1const key = [ "name", "address", "tel" ]; 2const valuelist = [ 3 [ "田中", "日本", "000000000" ], 4 [ "佐藤", "日本", "000000000" ] 5]; 6 7const objlist = []; 8 9valuelist.forEach(arrVal => { 10 // objは、オブジェクトとして宣言する 11 const obj = {}; 12 key.forEach((keyVal, index) => { 13 obj[keyVal] = arrVal[index]; 14 }); 15 objlist.push(obj); 16});

ただ、質問のコードと同じ動きをさせましたが、おそらく、質問者さんの意図した構造にならないかと・・・。
(valuelistの要素の値で毎回更新されるので、valuelistの最後の要素の分しか、objには入らない)

投稿2019/11/16 03:35

編集2019/11/16 06:12
miyabi_takatsuk

総合スコア9555

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

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

退会済みユーザー

退会済みユーザー

2019/11/16 05:12

ありがとうございます。 コードを見ながらスマホで打ったので、少々おかしな部分があったみたいです。大変失礼いたしました。 Object.keysの逆タイプの関数があるのではないかと思ったのですが、やはりfor文やmapで書くしかなさそうですね。
guest

0

わざわざforで作る意味が分からないですが、
幾らでもやりようはあります。

js

1var obj = {a:"test"};

オブジェクト初期化子

js

1 2var json_str = `{ 3 "a": "test", 4 "b": "hogehoge", 5 "c": [ 6 123, 7 456 8 ] 9} 10`; 11 12console.log(JSON.parse(json_str));

投稿2019/11/16 03:29

編集2019/11/16 03:34
m.ts10806

総合スコア80875

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

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

退会済みユーザー

退会済みユーザー

2019/11/16 03:38

ありがとうございます。 オブジェクトを初期値に1つずつ直接書けばできるのですが、 key配列とvaluelist配列からオブジェクトを作る方法を探しています。
m.ts10806

2019/11/16 03:45

もう少し前提や背景を記載いただけますか? でないと「なぜ配列から始めるんだろう。普通にそういうの作ればいいじゃん」という印象なので。 繰り返しはforに限ったものではないですしね。別々の配列なのであれば何かしら繰り返し処理を入れるしかありません。 簡潔さを求めているのでしたらmapとかで工夫すればできないこともないかもしれませんが、 https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/map 「key,value配列が必ず同じ数で、マッチする順番で入っている」保証が確約されているかどうかで難易度が変わります。 ので、その配列が送られてくる元を改修した方が早いんじゃないかと言う風にも思います。
退会済みユーザー

退会済みユーザー

2019/11/16 05:09

ありがとうございます。 確かにそのほうが早そうですね。見直してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問