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

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

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

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

Q&A

解決済

3回答

941閲覧

Javascript オブジェクトの一部を参照渡ししたい

actine

総合スコア16

JavaScript

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

0グッド

0クリップ

投稿2017/07/07 14:28

編集2017/07/07 15:08

タイトルの通り、
あるオブジェクトの特定のキーの参照を別の変数に渡す
ということを実現したいです。

js

1var families = { 2 father: { 3 name: 'Taro', 4 age: 42 5 }, 6 mother: { 7 name: 'Hanako', 8 age: 40 9 }, 10 sister: { 11 name: 'Yuki', 12 age: 16 13 } 14}; 15 16var father = families.father; 17 18father = { 19 name: 'Tom', 20 age: 45 21}; 22 23console.log(families);

とした時に

JSON

1{ 2 father: { 3 name: 'Tom', 4 age: 45 5 }, 6 mother: { 7 name: 'Hanako', 8 age: 40 9 }, 10 sister: { 11 name: 'Yuki', 12 age: 16 13 } 14}

になって欲しいのですが、どのように参照を渡せば良いのかわかりません。

上記例では簡略化しましたが、実際には深くネストしたオブジェクトの一部を動的に参照したいと考えております。
よろしくお願いいたします。

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

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

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

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

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

kei344

2017/07/07 15:07

「console,log」ではなく「console.log」では。
actine

2017/07/07 15:09

ありがとうございます。修正しました。
guest

回答3

0

ベストアンサー

単純にこういうことでしょうか。

JavaScript

1var families = { 2 father: { 3 name: 'Taro', 4 age: 42 5 }, 6 mother: { 7 name: 'Hanako', 8 age: 40 9 }, 10 sister: { 11 name: 'Yuki', 12 age: 16 13 } 14}; 15 16var father = families.father; 17 18father.name = 'Tom'; 19father.age = 45; 20 21console.log( families );

それともオブジェクトで渡したい、ということでしょうか。

JavaScript

1var families = { 2 father: { 3 name: 'Taro', 4 age: 42 5 }, 6 mother: { 7 name: 'Hanako', 8 age: 40 9 }, 10 sister: { 11 name: 'Yuki', 12 age: 16 13 } 14}; 15 16var father = families.father; 17function rewrite( obj1, obj2 ) { 18 Object.keys( obj1 ).forEach( function( k ){ 19 if ( obj2.hasOwnProperty( k ) ) obj1[ k ] = obj2[ k ]; 20 } ); 21} 22rewrite( father, { 23 name: 'Tom', 24 age: 45 25} ); 26 27console.log( families ); 28```**動くサンプル:**[https://jsfiddle.net/zo508fbs/](https://jsfiddle.net/zo508fbs/)

投稿2017/07/07 15:42

kei344

総合スコア69398

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

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

actine

2017/07/07 15:47

解決いたしました。 プロパティが不確定なため直接Objectを渡したかったので非常に助かりました。 ありがとうございます。
think49

2017/07/08 11:20 編集

後半のコードですが、families.father が全てのプロパティを備えている必要があるので、ご注意下さい。 families.father = {name: 'Taro'}; rewrite( families.father, {name: 'Tom', age: 45} ); console.log(JSON.stringify(families.father)); // {"name":"Tom"} 参考までに、ES6 には Object.assign があり、Polyfillを適用すればIE11でも使えます。 https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
kei344

2017/07/08 05:19

To: think49さん 半端な関数を作るより Object.assign がありましたね、指摘ありがとうございます。
guest

0

これだと単純にオブジェクを丸ごと上書きしちゃってますね。

javascript

1father = { 2 name: 'Tom', 3 age: 45 4};

fatherに直接代入するのではなく下記のようにしてみてください。

javascript

1father.name = 'Tom'; 2fahter.age = 45;

投稿2017/07/07 15:30

tell_k

総合スコア2120

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

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

0

本件の例ですと

javascript

1var ownerObjectOfFather = families; 2ownerObjectOfFather.father = { name: 'Tom', age: 45 };

とすればよいと思います。つまり、更新したいプロパティーを直接保持しているオブジェクトを用いて、そのプロパティーへの代入文により更新をすればよいと思います。

関係ないかも知れませんが、jQueryのextendメソッドのようなことがしたいのではないか・・・と、そんな気もしました。もしそうなら自分でややこしいコード書かなくてもextendで足りるかも知れません。勘違いだったらご容赦です。


なお、Javascriptは値渡しのみの言語と思いますので「参照渡し」という用語自体の使用は避けた方が無難だと思います。個人的にはそのような用語の使い方は混乱を招く気がします。VBAやC++のように関数への実引数の渡し方として値のコピーを渡すことと値が格納されている場所を渡すことを選べる言語においてのみ参照渡しという用語を使った方がよいのではないかと思います。

投稿2017/07/07 15:40

KSwordOfHaste

総合スコア18394

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問