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

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

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

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

Q&A

解決済

1回答

1084閲覧

想配列で一致する箇所 プラスメンバ追加

snakeriver

総合スコア76

JavaScript

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

0グッド

0クリップ

投稿2016/06/22 02:22

2つの連想配列で一致する箇所を見つけてその列のメンバ変数を片方の連想配列に足すには
どういった記述をすればいいでしょうか。

attendanceとdataの両方のdateとnameが一致する箇所があれば、attendanceにvehicleを同じ列に足したいのです。

ご教示ご教示お願いいたします。

var attendance ={ "obj1":{"date":"2015-01-01","name":"tanaka","出勤":"09:00:00","退勤":"18:00:00"}, "obj2":{"date":"2015-01-01","name":"kimura","出勤":"10:00:00","退勤":"20:00:00"}, "obj3":{"date":"2015-01-02","name":"tanaka","出勤":"09:00:00","退勤":"18:00:00"}, "obj4":{"date":"2015-01-02","name":"kimura","出勤":"10:00:00","退勤":"20:00:00"} }; var data ={ "data1":{"date":"2015-01-01","name":"tanaka","vehicle":"car"}, "data2":{"date":"2015-01-01","name":"kimura","vehicle":"car"}, "data3":{"date":"2015-01-01","name":"noguchi","vehicle":"train"}, "data4":{"date":"2015-01-01","name":"kikuchi","vehicle":"train"}, "data4":{"date":"2015-01-02","name":"tanaka","vehicle":"train"} };

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

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

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

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

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

guest

回答1

0

ベストアンサー

普通に2重ループ回すしかないと思います。

javascript

1var attendance ={ 2 "obj1":{"date":"2015-01-01","name":"tanaka","出勤":"09:00:00","退勤":"18:00:00"}, 3 "obj2":{"date":"2015-01-01","name":"kimura","出勤":"10:00:00","退勤":"20:00:00"}, 4 "obj3":{"date":"2015-01-02","name":"tanaka","出勤":"09:00:00","退勤":"18:00:00"}, 5 "obj4":{"date":"2015-01-02","name":"kimura","出勤":"10:00:00","退勤":"20:00:00"} 6}; 7 8var data ={ 9 "data1":{"date":"2015-01-01","name":"tanaka","vehicle":"car"}, 10 "data2":{"date":"2015-01-01","name":"kimura","vehicle":"car"}, 11 "data3":{"date":"2015-01-01","name":"noguchi","vehicle":"train"}, 12 "data4":{"date":"2015-01-01","name":"kikuchi","vehicle":"train"}, 13 "data4":{"date":"2015-01-02","name":"tanaka","vehicle":"train"} 14}; 15 16var attendance_and_vehicle = Object.keys(attendance).reduce( (dict, key) => { 17 var target = attendance[key]; 18 target.vehicle = ( 19 Object.keys(data).map( 20 (key) => data[key] 21 ).filter( 22 (dataN) => ( target.date==dataN.date && target.name==dataN.name ) 23 )[0] || {} 24 ).vehicle; 25 dict[key]= target; 26 return dict; 27},{});

#####追記
コメントを受けて、アロー式を普通の関数で書き直しました。

javascript

1var attendance_and_vehicle = Object.keys(attendance).reduce( function(dict, key){ 2 var target = attendance[key]; 3 target.vehicle = ( 4 Object.keys(data).map( 5 function(key){ return data[key] } 6 ).filter( 7 function(dataN){ return ( target.date==dataN.date && target.name==dataN.name ) } 8 )[0] || {} 9 ).vehicle; 10 dict[key]= target; 11 return dict; 12},{});

投稿2016/06/22 03:12

編集2016/06/22 04:20
Lhankor_Mhy

総合スコア36104

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

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

snakeriver

2016/06/22 03:58 編集

ありがとうございます。 しかしながら、() => の記述がわからないです。
snakeriver

2016/06/22 04:58

ありがとうございます!追加したいvehicleみたいなメンバが複数あれば、target.vehicleの部分を複数記述すればいいでしょうか。
Lhankor_Mhy

2016/06/22 05:11

そうですね、filter関数の戻りを取っておいて、都度参照すればいいと思います。
snakeriver

2016/06/22 08:47

すみません、.filter( )[0] || {} の部分はどういった意味か教えて頂けますか。
Lhankor_Mhy

2016/06/22 09:54

合致するdataがない場合、.filter( )は [] を返すので、.filter( )[0] が undefined になります。そのままだとエラーになるので、空の連想配列を返すようにしています。あまりよくないコードだと思います。 ワンライナーにしようとして、途中でやめたので……
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問