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

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

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

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

AngularJS

AngularJSはオープンソースのJavaScriptフレームワークです。ブラウザ上で動作するウェブアプリケーションの開発にMVCアーキテクチャを取り入れることを目的としています。

Q&A

解決済

2回答

2816閲覧

javascript 2つの連想配列で一致箇所追加

snakeriver

総合スコア76

JavaScript

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

AngularJS

AngularJSはオープンソースのJavaScriptフレームワークです。ブラウザ上で動作するウェブアプリケーションの開発にMVCアーキテクチャを取り入れることを目的としています。

0グッド

0クリップ

投稿2016/06/22 09:54

以下のような連想配列が2つあり、attendanceの方に名前(name)と日付(date)が合えば、dataの配列のvehicleとstaffのdepを追加したいのですが、
staff.depでは認識されないようなので、どう記述すればいいでしょうか。
後、複数項目追加したいので、target.date==dataN.date && target.name==dataN.name の判定をした上での記述はどうすればいいでしょうか。

angularjsでの違うテーブルのリストを合体させたいという趣旨ですが、いい方法はないでしょうか。

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", "staff":{"id":"01","dep":"sales"}}, "data2":{"date":"2015-01-01","name":"kimura","vehicle":"car", "staff":{"id":"02","dep":"engineer"}}, "data3":{"date":"2015-01-01","name":"noguchi","vehicle":"train","staff":{"id":"03","dep":"bookkeeper"}}, "data4":{"date":"2015-01-01","name":"kikuchi","vehicle":"train", "staff":{"id":"04","dep":"engineer"}}, "data4":{"date":"2015-01-02","name":"tanaka","vehicle":"train", "staff":{"id":"01","dep":"sales"}} }; var attendance_and_vehicle = Object.keys(attendance).reduce( function(dict, key){ var target = attendance[key]; target.vehicle = ( Object.keys(data).map( function(key){ return data[key] } ).filter( function(dataN){ return ( target.date==dataN.date && target.name==dataN.name ) } )[0] || {} ).vehicle; target.staff.dep = ( Object.keys(data).map( function(key){ return data[key] } ).filter( function(dataN){ return ( target.date==dataN.date && target.name==dataN.name ) } )[0] || {} ).staff.dep; dict[key]= target; return dict; },{});

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

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

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

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

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

guest

回答2

0

「オブジェクトを deep merge したい」という事でしょうか。
data.data4 が重複しているのは typo とし、vehicle, staff プロパティをマージするコードを書いてみました。

JavaScript

1'use strict'; 2var attendance ={ 3 "obj1":{"date":"2015-01-01","name":"tanaka","出勤":"09:00:00","退勤":"18:00:00"}, 4 "obj2":{"date":"2015-01-01","name":"kimura","出勤":"10:00:00","退勤":"20:00:00"}, 5 "obj3":{"date":"2015-01-02","name":"tanaka","出勤":"09:00:00","退勤":"18:00:00"}, 6 "obj4":{"date":"2015-01-02","name":"kimura","出勤":"10:00:00","退勤":"20:00:00"} 7}; 8 9var data ={ 10 "data1":{"date":"2015-01-01","name":"tanaka","vehicle":"car", "staff":{"id":"01","dep":"sales"}}, 11 "data2":{"date":"2015-01-01","name":"kimura","vehicle":"car", "staff":{"id":"02","dep":"engineer"}}, 12 "data3":{"date":"2015-01-01","name":"noguchi","vehicle":"train","staff":{"id":"03","dep":"bookkeeper"}}, 13 "data4":{"date":"2015-01-01","name":"kikuchi","vehicle":"train", "staff":{"id":"04","dep":"engineer"}}, 14 "data5":{"date":"2015-01-02","name":"tanaka","vehicle":"train", "staff":{"id":"01","dep":"sales"}} 15}; 16 17var attendance_and_vehicle = Object.keys(attendance).reduce(function (previous, currentProperty) { 18 var currentValue = previous[currentProperty]; 19 20 for (var i = 0, keys = Object.keys(data), l = keys.length, date = currentValue.date, name = currentValue.name; i < l; ++i) { 21 var value = data[keys[i]]; 22 23 if (value.date === date && value.name === name) { 24 currentValue.vehicle = value.vehicle; 25 currentValue.staff = value.staff; 26 return previous; 27 } 28 } 29 30 return previous; 31}, JSON.parse(JSON.stringify(attendance))); 32 33console.log(JSON.stringify(attendance_and_vehicle)); // {"obj1":{"date":"2015-01-01","name":"tanaka","出勤":"09:00:00","退勤":"18:00:00","vehicle":"car","staff":{"id":"01","dep":"sales"}},"obj2":{"date":"2015-01-01","name":"kimura","出勤":"10:00:00","退勤":"20:00:00","vehicle":"car","staff":{"id":"02","dep":"engineer"}},"obj3":{"date":"2015-01-02","name":"tanaka","出勤":"09:00:00","退勤":"18:00:00","vehicle":"train","staff":{"id":"01","dep":"sales"}},"obj4":{"date":"2015-01-02","name":"kimura","出勤":"10:00:00","退勤":"20:00:00"}}

変数を分けて Array#reduce を使っている事から attendanceattendance_and_vehicle で依存関係がないように書いていますが、破壊的で良いのなら attendance を直接書き換える手法がより効率的です。

JavaScript

1Object.keys(attendance).forEach(function (key) { 2 // attendance[key] を書き換える 3});

Re: snakeriver さん

投稿2016/06/22 10:25

編集2016/06/22 10:35
think49

総合スコア18162

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

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

snakeriver

2016/06/23 06:11

ありがとうございます!破壊的には記述はしないつもりです。
guest

0

ベストアンサー

attendance[key].staffundefinedなので、attendance[key].staff.deptundefined.deptになり、エラーです。
あと、filter関数の戻りを取って置いて使いまわした方がいいです。

javascript

1var attendance_and_vehicle = Object.keys(attendance).reduce( function(dict, key){ 2 var target = attendance[key]; 3 var injectData = Object.keys(data).map( 4 function(key){ return data[key] } 5 ).filter( 6 function(dataN){ return ( target.date==dataN.date && target.name==dataN.name ) } 7 )[0] 8 if (injectData){ 9 target.vehicle = injectData.vehicle; 10 target.staff = { dept: injectData.staff.dep }; 11 } else { 12 target.vehicle = undefined; 13 target.staff = { dept: undefined }; 14 } 15 dict[key]= target; 16 return dict; 17},{});

投稿2016/06/22 10:10

Lhankor_Mhy

総合スコア36057

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

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

snakeriver

2016/06/23 06:10

ありがとうございます!しかしながら、 target.staff = { dept: injectData.staff.dep }; とかで、deptがnullである場合、nullのままの処理はどうすればいいでしょうか。 エラーで angular.min.js:107 TypeError: Cannot read property 'dept' of null と表示されてしまうます。
Lhankor_Mhy

2016/06/24 01:58

angularの中で起きているエラーのようなので何とも言えませんが、エラーメッセージを見る限りstaffがnull値になっているデータがあるようなので、まずはそこを直した方がいいのでは。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問