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

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

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

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

2回答

17170閲覧

二つの配列をそれぞれkeyとvalueにして一つの連想配列にする方法

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

1クリップ

投稿2016/11/09 03:17

編集2016/11/09 07:26

組み込み関数があれば楽だなと思ったのですが、どうやら無いようなので。

javascript

1keys = ["name", "address", "tell" ]; 2 3values = ["東京都庁舎", "東京都新宿区歌舞伎町1-7-1", "03-5321-1111"];

こうしたい↓

javascript

1about = [{"name":"東京都庁舎", "address":"東京都新宿区歌舞伎町1-7-1", "tell":"03-5321-1111"}]; 2

一番楽な方法ってどんなのでしょうか。

参考:Qiita - jQueryで使える配列系便利関数
参考:Webkaru - 2つの配列から連想配列を作成 - array_combine()


修正

すみません、肝心の部分が抜けておりました。以下が修正後の質問です。

javascript

1keys = ["name", "address", "tell" ]; 2 3values = [ 4["東京都庁舎", "東京都新宿区歌舞伎町1-7-1", "03-5321-1111"], 5["埼玉県庁舎", "埼玉県さいたま市浦和区高砂3-15-1", "048-824-2111"] 6];

こうしたい↓

javascript

1about = [ 2{"name":"東京都庁舎", "address":"東京都新宿区歌舞伎町1-7-1", "tell":"03-5321-1111"}, 3{"name":"埼玉県庁舎", "address":"埼玉県さいたま市浦和区高砂3-15-1", "tell":"048-824-2111"} 4];

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

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

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

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

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

think49

2016/11/09 06:37

コードはそれぞれコードブロックで囲んでいただけませんか? ```(バッククオート3つ)で囲み、前後に改行をいれるか、コードを選択して「<code>」ボタンを押すとコードブロックになります。
退会済みユーザー

退会済みユーザー

2016/11/09 07:29

修正を行いました。ただ、個人的にはコードブロックは線でエリアが表現されるので可読性が悪いように思います。
think49

2016/11/09 07:34

そうですか…。個人的にはボーダーでコードブロックと本文が区切られるので視認性が高く、シンタックスハイライトで分かりやすく、固定幅フォントでインデントも揃うのでコードブロックを使っています。
guest

回答2

0

ベストアンサー

要素数が必ず1になる

JavaScript

1keys = ["name", "address", "tell" ]; 2values = ["東京都庁舎", "東京都新宿区歌舞伎町1-7-1", "03-5321-1111"];

こうしたい↓

JavaScript

1about = [{"name":"東京都庁舎", "address":"東京都新宿区歌舞伎町1-7-1", "tell":"03-5321-1111"}];

その前提条件ですと配列の要素数が必ず1になるので配列を使う意義が見いだせません。
元となるデータに更に条件があるのでは…。

JavaScript

1var keys = ["name", "address", "tell" ], 2 values = ["東京都庁舎", "東京都新宿区歌舞伎町1-7-1", "03-5321-1111"], 3 array = []; 4 5for (var i = 0, l = keys.length, obj = Object.create(null); i < l; ++i) { 6 if (values.hasOwnProperty(i)) { 7 obj[keys[i]] = values[i]; 8 } 9} 10 11array[0] = obj; 12console.log(JSON.stringify(array)); // [{"name":"東京都庁舎","address":"東京都新宿区歌舞伎町1-7-1","tell":"03-5321-1111"}]

Array.prototype.map

(2016/11/09 13:54追記)

追記された条件を元にコードを書き換えました。

JavaScript

1'use strict'; 2var arrayToMap = (function () { 3 function mapfn (values) { 4 for (var i = 0, l = this.length, obj = Object.create(null); i < l; ++i) { 5 if (values.hasOwnProperty(i)) { 6 obj[this[i]] = values[i]; 7 } 8 } 9 10 return obj; 11 } 12 13 return function arrayToMap (array, keys) { 14 return array.map(mapfn, keys); 15 } 16}()); 17 18var keys = ['name', 'address', 'tell' ], 19 values = [ 20 ['東京都庁舎', '東京都新宿区歌舞伎町1-7-1', '03-5321-1111'], 21 ['埼玉県庁舎', '埼玉県さいたま市浦和区高砂3-15-1', '048-824-2111'] 22 ]; 23 24var about = arrayToMap(values, keys); 25console.log(JSON.stringify(about)); // [{"name":"東京都庁舎","address":"東京都新宿区歌舞伎町1-7-1","tell":"03-5321-1111"},{"name":"埼玉県庁舎","address":"埼玉県さいたま市浦和区高砂3-15-1","tell":"048-824-2111"}]

(2016/11/09 20:47 追記)

変な質問なのですが、なぜそのコードにされたのですか。

まず、私は「短いコード」よりも「可読性」「保守性」「厳密性」を重視しています。

  • for 文では存在しないプロパティを走査する事がある為、hasOwnProperty を入れました
  • {} では意図せず [[Prototype]] 上のプロパティを拾う事がある為、Object.create(null) を使いました
  • テストした結果を確認する為に JSON.stringify() を使いました(console.logconsole.dir でも確認可能ですが、出力結果をここに張り付けるなら JSON.stringify は重宝します)
  • Array.prototype.map の第一引数に関数式を指定するとGCの扱いが微妙かつ、関数呼び出しする度に関数オブジェクトが生成される為、パフォーマンスを考慮してクロージャにコールバック関数を閉じ込めました

それぞれに意味があって書いているコードですので私はそれを「必要なもの」と考えています。
逆に言えば、例外処理を甘くしてキャッシュする変数を減らせば短く書く事は可能ですが、そういうコードは思わぬところで想定外の動作を引き起こし、混乱を生むので良くないと思ってます。
良いコードは想定外の値が与えられたときに動かない、か原因に気が付きやすい設計をしています。

配列を回す手段は主に4つあります。

  • while
  • for
  • for-of
  • Array.prototype 系メソッド

自身の嗜好を重んずるなら私は for or while 文のネストを採用しますが、この手のコードは敬遠される傾向があるように思います。
ですので、万人受けするであろう Array.prototype.map を採用しました。
一通りの手段を熟知している人であれば、どの技術を採用するかは個人の好みだと思います。
k-s さんにとって for 文のネストが読みやすかったのであれば、for 文が最も k-s さんに親しみ深い使い慣れたものだったのでしょう。

new Map (ES6)

完全に私の好みで書いていいのなら私は Map を使います。

JavaScript

1'use strict'; 2var arrayToMap = (function (isArray, Map) { 3 return function arrayToMap (array, keys) { 4 var results = []; 5 6 for (var i = 0, l = array.length, values; i < l; ++i) { 7 values = array[i]; 8 9 if (isArray(values)) { 10 for (var j = 0, m = values.length, entries = []; j < m; ++j) { 11 if (values.hasOwnProperty(j) && keys.hasOwnProperty(j)) { 12 entries.push([keys[j], values[j]]); 13 } 14 } 15 16 results.push(new Map(entries)); 17 } 18 } 19 20 return results; 21 }; 22}(Array.isArray, Map)); 23 24var keys = ['name', 'address', 'tell' ], 25 values = [['東京都庁舎', '東京都新宿区歌舞伎町1-7-1', '03-5321-1111'],['埼玉県庁舎', '埼玉県さいたま市浦和区高砂3-15-1', '048-824-2111']], 26 about = arrayToMap(values, keys), 27 array = []; 28 29for (let map of about) { 30 array.push([...map]); 31} 32console.log(JSON.stringify(array)); // [[["name","東京都庁舎"],["address","東京都新宿区歌舞伎町1-7-1"],["tell","03-5321-1111"]],[["name","埼玉県庁舎"],["address","埼玉県さいたま市浦和区高砂3-15-1"],["tell","048-824-2111"]]]

基本的に new Map はオブジェクト初期化子の上位互換ですので、値を取りだすときにも扱いやすいです。
後々、JSON 化する予定があるのなら Map からオブジェクト初期化子に変換するコードを書きます。

Re: k-s さん

投稿2016/11/09 03:24

編集2016/11/09 11:47
think49

総合スコア18162

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

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

退会済みユーザー

退会済みユーザー

2016/11/09 03:47

色々と説明を端折ってしまい申し訳ございません。 実際には複数件のデータを扱います。今気付いたのですがこの質問だと若干まずそうです。 質問を修正いたします。
think49

2016/11/09 04:55

親記事を編集しました。 質問文のコードですが、markdownで書いて頂けますようお願いします。 https://teratail.com/help
退会済みユーザー

退会済みユーザー

2016/11/09 10:34

今のところ個人的にはyambejpのコードの方が短くて良いなと思っています。 ただ、think49さんはjavascriptで総合1位の方で、評価も現時点で3となっているのが気になりました。 変な質問なのですが、なぜそのコードにされたのですか。特にJSON.stringify(about)の部分は、実は私の質問の背景にとってものすごく重要なコードでした。なぜその一文を入れたのか、後学のために教えていただけないでしょうか。
think49

2016/11/09 11:51 編集

親記事に追記しました。 > コードの方が短くて良い これについては https://teratail.com/questions/50611 の LLman さんと同様の考えを持っています。 同じことを実装する為により短くできるなら意味がありますが、何らかの意図があってコードが長くなっているのならそれは無駄ではなく、必要なものだと考えます。 とはいえ、「その部分に必要性を感じるか」は個人の考え方の違いがあるとは思います。
退会済みユーザー

退会済みユーザー

2016/11/09 13:28

丁寧な回答ありがとうございます。正直に言うとthink49さんのコードは自分にはまだ早いようで、半分も理解できていません。質問して返ってくる量と質が半端じゃないです。 今後理解できるようにします。 本当にありがとうございます。
guest

0

こういう書き方をしてよいのかちょっと微妙ですがどうでしょう?

javascript

1var keys = ["name", "address", "tell" ]; 2var values = [ 3["東京都庁舎", "東京都新宿区歌舞伎町1-7-1", "03-5321-1111"], 4["埼玉県庁舎", "埼玉県さいたま市浦和区高砂3-15-1", "048-824-2111"] 5]; 6var about =[]; 7for(var i=0;i<values.length;i++){ 8 about.push({}); 9 for(var j=0;j<keys.length;j++){ 10 about[i][keys[j]]=values[i][j]; 11 } 12} 13console.log(about);

投稿2016/11/09 07:37

yambejp

総合スコア114814

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

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

退会済みユーザー

退会済みユーザー

2016/11/09 07:41

ほぼ同じコードになりました。自分的にはfor文の入れ子ってあまり好きではないのですが、これが一番わかりやすいです。
退会済みユーザー

退会済みユーザー

2016/11/09 07:54

ちなみになんですが、自分は for(var i=0;i<values.length;i++){ about[i] = {}; for(var j=0;j<keys.length;j++){ about[i][keys[j]]=values[i][j]; } } と書いていました。これでも特に問題なく動いたのですが、後になって「そういえばpushしてるわけでもないのにabout[i]={}としただけでどんどん追加されていくんだ」と思いました。何故なんでしょうか。
yambejp

2016/11/09 08:55

about配列ですから未設定のabout[i]に値(今回はオブジェクト)を代入すれば 新しい要素が追加になります。 pushは明示的に追加している感をだしたいだけなので 結果的には同じです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問