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

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

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

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

Q&A

解決済

5回答

1855閲覧

JavaScriptオブジェクトからプロパティと値を取り出す

yoshimatsu

総合スコア8

JavaScript

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

0グッド

0クリップ

投稿2018/02/13 23:20

JavaScriptの勉強中です。
初めての質問です。
以下のようにオブジェクトからプロパティと値を取り出すにはどのようにするのがいいでしょうか?

let a; let b; let c; let o = {a: 1, b: 2, c: 3};

ここから

console.log("a= " + a); //a= 1 console.log("b= " + b); //b= 2 console.log("c= " + c); //c= 3

よろしくお願いします。

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

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

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

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

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

guest

回答5

0

js

1let o = {a: 1, b: 2, c: 3}; 2let{a,b,c} = o;

letを使っているから、分割代入を使っていいんですよね?

投稿2018/02/14 00:22

Lhankor_Mhy

総合スコア36115

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

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

yoshimatsu

2018/02/14 01:09

letであるべきかわかりません。本来はvarにすべきかもしれません。 ご回答いただいた方法で変数a、b、c自体の値をoの中身と同じ1、2、3になることを確認できました。 ありがとうございました。
m0a

2018/02/14 01:22

letかvarかと言うのはjavascriptの言語仕様の話です。今現在は意図がなければ(例えば古いブラウザでjsを動かしたい等) let, constを使うべきです。ES2015で調べてみて下さい
yoshimatsu

2018/02/14 01:49

ES2015調べるようにします。
Lhankor_Mhy

2018/02/14 02:04

分かりにくくてすみません。 回答のコードはIE11では動作しないです。 let定義はIE11でも動作します(たぶん)が、let定義も分割代入もES6(ES2015)と呼ばれる仕様です。 なので、「(ES6の)letを使っているから、(ES6の)分割代入を使っていいんですよね?」という意味で書きました。
yoshimatsu

2018/02/14 02:17

そう言う意味ですか? ちゃんとは理解できていませんがletは今年になって、分割代入は今回知りました。
yoshimatsu

2018/02/14 04:35

for...inとevalを用いる方法にしたいと思います。質問の回答としては分割代入が正しいのですがベストアンサーは他の方にさせていただきます。
yoshimatsu

2018/02/14 04:41

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

0

オブジェクトからプロパティと値を取り出すにはどのようにするのがいいでしょうか?

オブジェクトはそれそのものがインデックス付きの本みたいなものです。
どうしてもバラバラにすべきケースを除いて、オブジェクトのまま使うのが分かりやすいと思います。

JavaScript

1// オブジェクトとプロパティの同時宣言 2let o = {a: 1, b: 2, c: 3}; 3 4// 各プロパティから値を取り出したい 5console.log(o.a); // 1 6console.log(o.b); // 2 7console.log(o.c); // 3 8 9// 各プロパティへの値を格納したい 10o.a = 10; 11o.c = 30; 12console.log(o); // {a: 10, b: 2, c: 30}

質問文を素直に解く

プロパティから値を取り出す方法さえわかれば楽勝です。

JavaScript

1let a; 2let b; 3let c; 4let o = {a: 1, b: 2, c: 3}; 5 6a = o.a; 7b = o.b; 8c = o.c; 9 10console.log("a= " + a); //a= 1 11console.log("b= " + b); //b= 2 12console.log("c= " + c); //c= 3

ES2015という新しいJavaScriptのバージョンの書き方では
オブジェクトの分割代入という書き方がサポートされました。
これにより変数a, b, cの3つを一気に宣言できます。

JavaScript

1let o = {a: 1, b: 2, c: 3}; 2let {a, b, c} = o; 3 4console.log("a= " + a); //a= 1 5console.log("b= " + b); //b= 2 6console.log("c= " + c); //c= 3

最初の書き方より随分鮮やかになりましたね。
これはIE11やopera等の一部のブラウザでは動作しませんので注意してください。
(Babelというツールがあり、ES2015専用のコードを上の愚直なやり方に変換する事ができます)

しかし1個ずつ書くというのは変数oの構造が変化した時に
存在しないプロパティを読み込もうとしてバグの原因になります。
そこで、一般的にはmaisumakunさんのような手法が用いられます。

投稿2018/02/14 01:19

miyabi-sun

総合スコア21158

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

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

yoshimatsu

2018/02/14 02:00

データベースから得られたデータの中身を取り出す正しい方法を知りたくての質問でした。データベースでやりとりしたい変数a、b、cは初めからo.a、o.b、o.cにしておくのがいいのでしょうか?
miyabi-sun

2018/02/14 02:28

データベースから得たデータというのは、基本的にはレコードとカラムの2軸による2次元配列です。 まぁJavaScriptは配列と連想配列が明確に分離されていますのでオブジェクトの配列ですが。 もしくは1レコードの場合素のオブジェクトかもしれませんね。 o.aは親oに対する子aという繋がりが読み取れます。 変数aを新たに作って格納すると、このaはo.aという繋がりからは切り離された存在になります。 だから長いfor文や関数の頭で変数作って切り離してしまうと、ずっと頭で覚えながらコードを触る必要があります。 この文の中でaと言えばo.aに決まってるだろう?と一目で分かるケース以外では、安易に切り離さずo.aのまま使う事をオススメします。
yoshimatsu

2018/02/14 04:38

for...inとevalを用いる方法にしたいと思います。ご指導ありがとうございました。
guest

0

for-in、もしくはObject.keysを使いましょう。

javascript

1// for-inのパターン 2let o = {a: 1, b: 2, c: 3}; 3for(const key in o) { 4 console.log(key + '= ' + o[key]); 5} 6 7// Object.keysのパターン 8// 回すのをセットにしなくても、キーの配列が取れるので便利 9Object.keys(o).forEach(key => { 10 console.log(key + '= ' + o[key]); 11});

投稿2018/02/13 23:26

maisumakun

総合スコア145184

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

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

yoshimatsu

2018/02/13 23:56

早速回答をいただきありがとうございます。 しかし説明が不十分でした。すみません。 変数a、b、c自体の値をoの中身と同じ1、2、3にしたいです。
maisumakun

2018/02/14 00:30

動的に変数名が決まる、という構造自体、あまり望ましくないのは間違いないです。 あらかじめキーが決まっているのであれば、Lhankor_Mhyさんの回答のような分割代入が適切になります。
yoshimatsu

2018/02/14 01:41

データベースから得られたデータの中身を取り出す正しい方法を知りたくての質問でした。この質問のオブジェクトのキーに当たるのがデータベースとやりとりしたい変数になります。Switch文でキーで20以上caseを書いています。
maisumakun

2018/02/14 01:47

DBでしたら列名は固定なので、分割代入のほうが向いていそうですね。
yoshimatsu

2018/02/14 04:33

提案いただいたfor...inとさらにevalを用いる方法にしたいと思います。いろいろご指導ありがとうございました。
guest

0

この場合にForが使えないですね。
下記の方法しかないと思います。

let o = {a: 1, b: 2, c: 3}
let { a, b, c } = o

Constも使えます。
const o = {a: 1, b: 2, c: 3}
const { a, b, c } = o

投稿2018/02/14 00:59

jerome.dupuis

総合スコア172

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

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

yoshimatsu

2018/02/14 02:06

ご回答ありがとうございます。データベースから得られたデータの中身を取り出す正しい方法を知りたくての質問でした。20組以上のデータをひと塊りにしてやりとりしています。
yoshimatsu

2018/02/14 04:38

for...inとevalを用いる方法にしたいと思います。ありがとうございました。
guest

0

ベストアンサー

変数a、b、c自体の値をoの中身と同じ1、2、3にしたいです。

javascript

1var o = {a: 1, b: 2, c: 3}; 2for(var i in o){ 3this[i]=o[i]; 4} 5console.log([a,b,c]);

追記

上記グローバル変数の場合でしたのでローカル変数には適用されません
オブジェクト自体外部から受け取るわけではなさそうですし
キーを特定の文字に制限するならevalを使ってもいいでしょう。

javascript

1(function(){ 2 var a=0,b=0,c=0,d=0,e=0; 3 var o = {a: 1, b: 2, c: 3,"d=4;e":5}; 4 for(var i in o){ 5 eval(i+"="+o[i]); 6 } 7 /*キーを検証しないと変数が汚染される可能性がある*/ 8 console.log([a,b,c,d,e]); 9 10 var a=0,b=0,c=0,d=0,e=0; 11 for(var i in o){ 12 /*日本語変数とか使わないかぎりこんな感じ*/ 13 if(i.match(/^[a-zA-Z_$][0-9a-zA-Z_$]*$/))eval(i+"="+o[i]); 14 } 15 console.log([a,b,c,d,e]); 16})(); 17

投稿2018/02/14 00:17

編集2018/02/14 03:15
yambejp

総合スコア114839

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

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

yoshimatsu

2018/02/14 00:47

ご回答ありがとうございます。 [undefined, undefined, undefined] と表示されます。 HTMLとJavaScriptのファイルをサーバーに置きSafariで確認しました。 何か注意することはありますか? var a; var b; var c; var o = {a: 1, b: 2, c: 3}; for(var i in o){ this[i]=o[i]; } console.log([a,b,c]);
yoshimatsu

2018/02/14 04:41

ご教授いただいたfor...inとevalを用いる方法にしたいと思います。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問