要素数が必ず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.log
や console.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 さん