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

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

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

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

Q&A

解決済

4回答

3444閲覧

javascriptの{}オブジェクトのキーの順序について

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

0グッド

1クリップ

投稿2017/12/29 01:39

###実現したいこと
以下のようなjavascriptオブジェクトのキーの並び順を、指定した任意の順に並び替えたいです。

javascript

1{ 2 address:"", 3 age:"", 4 client_name:"", 5 customer_id:"", 6 first_visit_date:"", 7 prefecture:"", 8}

以下のキー順序の指定をすると
var key_order = ['customer_id', 'client_name', 'age', 'prefecture', 'address', 'first_visit_date'];

↓ このようにしたいです。

javascript

1{ 2 customer_id:"", 3 client_name:"", 4 age:"", 5 prefecture:"", 6 address:"", 7 first_visit_date:"", 8}

オブジェクトをループし、ループ内で、if文で新たなmapに詰め替えて並び替えるといった方法がありますが、if文が多くなるので、それ以外で実装する方法ありますでしょうか。

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

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

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

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

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

guest

回答4

0

現在のJavaScriptの仕様では、オブジェクトでループを回した場合、キーがどのような順序になるのかは実装依存であり、必ず指定の並びになるように保証する方法はありません。オブジェクトでループを回さずに、順序づけられたキーの配列でループを回してしまうのはいかがでしょうか?

JavaScript

1const obj = { 2 address: '999-8531', 3 age: '18', 4 client_name: '寺 帝留', 5 customer_id: 't0001', 6 first_visit_date: '2017-12-29', 7 prefecture: '山形県', 8}; 9const keyOreder = ['customer_id', 'client_name', 'age', 'prefecture', 'address', 10 'first_visit_date']; 11const array = []; 12for (const key of keyOreder) { 13 array.push(obj[key]); 14} 15console.log(array); 16// => [ 't0001', '寺 帝留', '18', '山形県', '999-8531', '2017-12-29' ]

投稿2017/12/29 02:37

raccy

総合スコア21735

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

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

退会済みユーザー

退会済みユーザー

2017/12/29 02:55

ありがとうございます!勉強させていただきました!
guest

0

ベストアンサー

keyorderをmapしてはいけないのでしょうか?

javascript

1var o={ 2 address:"A", 3 age:"B", 4 client_name:"C", 5 customer_id:"D", 6 first_visit_date:"E", 7 prefecture:"F", 8} 9var key_order = ['customer_id', 'client_name', 'age', 'prefecture', 'address', 'first_visit_date']; 10var a=key_order.map(function(x){ 11 return o[x]; 12}); 13console.log(a);

投稿2017/12/29 02:22

yambejp

総合スコア114843

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

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

退会済みユーザー

退会済みユーザー

2017/12/29 02:54

ありがとうございます!!勉強させていただきました!
guest

0

オブジェクトは仕様上、要素の順番が保証されません。
ブラウザによっては気を利かせてキーの文字列順に並べて表示してくれることもあるようですが、並び順やfor...in文で取り出すときの順序は保証されないです。

何をしたいのかにもよりますが、後から値を取り出したいだけなら、順序を並べ替えなくてもよいと思います。

投稿2017/12/29 01:57

編集2017/12/29 01:58
Udomomo

総合スコア1524

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

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

退会済みユーザー

退会済みユーザー

2017/12/29 02:12

質問がまずくてすみません。 並び替えた後には、それをそのままfor..inで回して、arrayにpushしようとしてました。 つまり、並び替えてmapに格納することが目的ではありませんでして、 指定のキー順に、arrayにpushする方法を考えるのが本来の質問でした。
guest

0

new Map

keyの順序に意味があるのなら、「順序性が保証される** new Map**」を使用すると、オブジェクト初期化子のしがらみから解放されます。

JavaScript

1'use strict'; 2var map = new Map([['address', ''],['age',''],['client_name',''],['customer_id',''],['first_visit_date',''],['prefecture','']]); 3var keyOrder = ['customer_id', 'client_name', 'age', 'prefecture', 'address', 'first_visit_date']; 4 5var map2 = new Map(keyOrder.map(key => [key, map.get(key)]));

Map はオブジェクト初期化子よりも便利ですが、配列程の自由はないので、いずれはsortやreduceが欲しくなって物足りなく感じるかもしれません。
その場合は、次の二択となります。

  • Map.prototype を拡張する
  • Map 似のインターフェースを持つ CustomMap を作成して、prototype拡張する

Re: keeton さん

投稿2017/12/29 15:52

think49

総合スコア18164

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

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

退会済みユーザー

退会済みユーザー

2017/12/30 00:11

ありがとうございます! new mapがあるとは、知りませんでした。 勉強させていただきました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問