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

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

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

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

Q&A

解決済

3回答

800閲覧

JavaScriptで連想配列をソートしたい

okame

総合スコア54

JavaScript

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

0グッド

0クリップ

投稿2018/08/17 03:54

前提・実現したいこと

たとえばこんな連想配列があったとして、

javascript

1var array = { 2 2: ["2", 0, 0, 0, 0], 3 ccc: ["ccc", 9999, 0, 0, 0], 4 あああ: ["あああ", 0, 0, 0, 9999], 5 1: ["1", 0, 0, 9999, 0], 6 aaa: ["aaa", 0, 0, 0, 0] 7}

これを以下のように並べ替えたいです。

javascript

1var array = { 2 1: ["1", 0, 0, 9999, 0], 3 2: ["2", 0, 0, 0, 0], 4 aaa: ["aaa", 0, 0, 0, 0], 5 ccc: ["ccc", 9999, 0, 0, 0], 6 あああ: ["あああ", 0, 0, 0, 9999], 7}

こういった場合どのようにすればよいでしょうか?

試したこと

.sort()を使って以下のように書いてみたのですが、

javascript

1array.sort(function (a, b) { 2 var comparison = 0; 3 if (a[0] > b[0]) { 4 comparison = 1; 5 } else if (a[0] < b[0]) { 6 comparison = -1; 7 } 8 return comparison; 9});

どうもうまくいきません。

以上です

お手数ですが皆様のお知恵を拝借できれば幸いです。

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

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

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

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

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

guest

回答3

0

{} は連想配列ではありません。
https://teratail.com/questions/125406

Re: okame さん

投稿2018/08/17 03:57

think49

総合スコア18162

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

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

okame

2018/08/17 05:04

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

0

ベストアンサー

まず、JavaScriptのオブジェクトは他言語の連想配列にあたるものですが、
連想配列ではないので順不同なものであり、順番が保証してくれない特性があります。
(JSの最新の仕様で順番は指定できましたっけ?でも順番を編集する機能は特にない)

これが前提でまぁ気にしないほうが良いかとは思いますが、
多分新しいオブジェクトを作って格納していけば、ソート済みのオブジェクトが生成出来るかと想います。
Chromeの場合、下記のコードで意図通りの動作を確認しました。

JavaScript

1var array = { 2 2: ["2", 0, 0, 0, 0], 3 ccc: ["ccc", 9999, 0, 0, 0], 4 あああ: ["あああ", 0, 0, 0, 9999], 5 1: ["1", 0, 0, 9999, 0], 6 aaa: ["aaa", 0, 0, 0, 0] 7} 8console.log(Object.keys(array)) 9// ["1", "2", "ccc", "あああ", "aaa"] <- 生成した瞬間に整数文字列の1と2は常に先に来るらしい 10 11var sortedKeys = Object.keys(array).sort() 12console.log(sortedKeys) 13// ["1", "2", "aaa", "ccc", "あああ"] <- キーの配列に変換してからソート 14 15var newArray = {} 16for (var key of sortedKeys) { 17 newArray[key] = array[key] 18} 19console.log(Object.keys(newArray)) 20// ["1", "2", "aaa", "ccc", "あああ"] <- 1と2は制御出来ないが「あああ」は最後尾に移動した

【追記】 maisumakunさんの助言: オブジェクトの整数文字列のキーは制御できません
確かに制御出来ませんでした。
他のキーは一応意図通りに順序を変更出来ましたので編集して載せておきます。

投稿2018/08/17 04:06

編集2018/08/17 04:24
miyabi-sun

総合スコア21158

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

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

maisumakun

2018/08/17 04:11

以前に何かで検証したのですが、Chromeの場合、整数文字列のキーは数値としての順番が強制されて、その順番を入れ替えたりはできないようです。
miyabi-sun

2018/08/17 04:19

あら、そうなんですね。 調査したら確かにそのような挙動でしたので修正しておきます。
maisumakun

2018/08/17 04:22

もちろんそれも保証される挙動ではないので、どうでもいいといえばどうでもいい話ですけどね。
okame

2018/08/17 05:13

ご教示いただいた方法で無事に解決しました! miyabi-sun さん、 maisumakun さん、本当にありがとうございました☆m(_ _)m
okame

2018/08/17 05:52 編集

最終的に①大文字小文字を区別しない②for ofはIE非対応なので使わない という仕様を追加して以下のようにしました。 ```javascript var array = { 1: ["1", 0, 0, 9999, 0], 2: ["2", 0, 0, 0, 0], AAA: ["AAA", 0, 0, 0, 0], ccc: ["ccc", 9999, 0, 0, 0], あああ: ["あああ", 0, 0, 0, 9999], aaa: ["aaa", 0, 0, 0, 0], CCC: ["CCC", 9999, 0, 0, 0] } var sortedKeys = Object.keys(array).sort(function (a, b) { var str1 = a.toLowerCase(); var str2 = b.toLowerCase(); var comparison = 0; if (str1 > str2) { comparison = 1; } else if (str1 < str2) { comparison = -1; } return comparison; }); var sortedList = {}; sortedKeys.forEach(function (key) { sortedList[key] = array[key]; }); ```
think49

2018/08/17 10:40

To: okame さん 整数値のキーがあるようですが、いいのでしょうか。
guest

0

まず検索をすると質問文を書かなくても答えが得られる場合があります。

javascriptで連想配列のソート
https://teratail.com/questions/125406

投稿2018/08/17 03:58

ku__ra__ge

総合スコア4524

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

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

okame

2018/08/17 05:04

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問