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

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

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

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

jQuery

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

Underscore.js

Underscore.jsは、JavaScriptのためのユーティリティライブラリです。JavaScriptの関数・配列、オブジェクトを扱う際に度々発生する処理がメソッドとしてまとめられています。他のライブラリに依存しないため、稼働中のアプリケーションにも導入可能です。

Q&A

解決済

3回答

7055閲覧

javascriptでネストされた連想配列をマージしたいです。

Natade_Gorilla

総合スコア13

JavaScript

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

jQuery

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

Underscore.js

Underscore.jsは、JavaScriptのためのユーティリティライブラリです。JavaScriptの関数・配列、オブジェクトを扱う際に度々発生する処理がメソッドとしてまとめられています。他のライブラリに依存しないため、稼働中のアプリケーションにも導入可能です。

0グッド

1クリップ

投稿2015/12/05 11:33

編集2015/12/05 12:47

javascriptでネストされた連想配列をマージしたいです。

var tmp1= {id : 1 , name : 'なまえ'} ; var tmp2= {id : 2 , tel : 11111} ; var a = { model_name : tmp1 }; var b = { model_name : tmp2 }; console.log( _.extend( a , b ) ); /* こうなってほしい id: 2, name: "なまえ", tel: 11111 } が こうなってしまう id: 2, tel: 11111 } */

_.extend( a['model_name'] , b['model_name']);

とやれば上手く行くのは分かるのですが、子要素を含めてマージしたいのです。
underscoreとjQueryは使用可能です。

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

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

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

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

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

blackonyx

2015/12/05 11:50 編集

a, bが配列である理由は何ですか?tmp1,tmp2がそれぞれに1つずつしか入っていないため、「マージ」後のイメージがつかみにくいです。 _.extend( a[0] , b[0]);ではダメな理由を具体的に示して下さい。 「子要素を含めて」だけでは、曖昧です。
blackonyx

2015/12/05 11:55

例えば、tmp1,tmp2以外にもtmp3,tmp4があった場合の欲しいマージ結果などを示してみてはどうでしょうか。
Natade_Gorilla

2015/12/05 12:53

質問内容を配列から連想配列に変更しました。 正直、ご指摘の内容を示すのはちょっと難しいです。 実際には本処理はループ文の中身と思っていただき、tmp1及びtmp2に入ってくるネストの深さが一定ではない(ただしtmp1とtmp2のネストのは同じ)なので、子要素ごとにマージするのが面倒なので妙案がないかと思っている次第なのです。
think49

2015/12/05 13:19

Object.values の中身をマージしたいという事でしょうか。正直、配列の方が処理しやすかったように思います。配列とオブジェクト初期化子では大分処理が異なります。変更前の配列の中身が一つしかないようですけど、実際には複数の値が入っている前提でしょうか。
guest

回答3

0

JavaScript

1'use strict'; 2/** 3 + Object.values() (ES7 stage3) 4 */ 5var getObjectValues = (function (keys, mapfn) { 6 return function getObjectValues (object) { 7 return keys(object).map(mapfn, object); 8 }; 9}(Object.keys, function mapfn (key) { 10 return this[key]; 11})); 12 13var mergeObjects1 = (function (assign, getObjectValues) { 14 function reducefn (previous, current) { 15 return assign(previous, current); 16 } 17 18 return function mergeObjects1 (target) { 19 var array = [], 20 i = 0, 21 l = arguments.length; 22 23 while (i < l) { 24 array = array.concat(getObjectValues(arguments[i++])); 25 } 26 27 return array.reduce(reducefn); 28 } 29}(Object.assign, getObjectValues)); 30 31var mergeObjects2 = (function (assign, getObjectValues) { 32 return function mergeObjects2 (target) { 33 var array = [], 34 i = 0, 35 l = arguments.length; 36 37 while (i < l) { 38 array = array.concat(getObjectValues(arguments[i++])); 39 } 40 41 return assign.apply(null, array); 42 }; 43}(Object.assign, getObjectValues)); 44 45var a = {model_name: {id : 1 , name : 'なまえ'}, model_name2: {address: 'tokyo'}}; 46var b = {model_name: {id : 2 , tel : 11111}, model_name2: {zip: 5555}}; 47 48console.log(JSON.stringify(mergeObjects1(a, b))); // {"id":2,"name":"なまえ","address":"tokyo","tel":11111,"zip":5555} 49console.log(JSON.stringify(mergeObjects2(a, b))); // {"id":2,"name":"なまえ","address":"tokyo","tel":11111,"zip":5555}

(2015/12/05 23:48追記)

Object.assign.apply 版コードを追加し、可変長引数にしました。

Re: Natade_Gorilla さん

投稿2015/12/05 14:05

編集2015/12/05 14:50
think49

総合スコア18162

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

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

0

ベストアンサー

いわゆるDeep Mergeと言う奴でしょうか?jQueryのextendでできるようです。
https://api.jquery.com/jquery.extend/#jQuery-extend-deep-target-object1-objectN

JavaScript

1console.log($.extend(true, a , b ); 2// => { model_name: { id: 2, name: 'なまえ', tel: 11111 } }

投稿2015/12/05 14:17

raccy

総合スコア21735

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

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

guest

0

a、bを使用しない、以下のコードではいかがでしょうか?

javascript

1var tmp1 = { id : 1 , name : 'なまえ'}; 2var tmp2 = { id : 2 , tel : 11111 }; 3console.log(_.extend(tmp1, tmp2)); // Object {id: 2, name: "なまえ", tel: 11111}

投稿2015/12/05 11:44

tako-black

総合スコア78

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

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

Natade_Gorilla

2015/12/05 12:55

回答ありがとうございます。あくまでも質問内容は実際のコードを簡略化し抜粋しているだけですので、実際には配列を使わない方法は取れないのです。。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問