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

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

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

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

Q&A

解決済

4回答

7419閲覧

javascriptのobjectのソートについて

ricy

総合スコア48

JavaScript

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

0グッド

3クリップ

投稿2016/08/06 12:34

以下のようなオブジェクトがあり、

Object {69a560179519: { id: 1, time:11:00}, 1b6507a0111a: { id: 2, time:13:00}, 08dda86dc511{ id: 3, time:12:00}}

time順にソートしたいのですが、いろいろ調べても
配列のソートはでてくるのですがオブジェクトについてのっておらず、
ご教示いただけないでしょうか。

※keyについては乱数なのでとくに気にされないでください

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

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

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

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

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

guest

回答4

0

オブジェクトでは不可能ですが、ES6 の Map には順序の概念があります。
ただし、Map は配列程にはメソッドが用意されてないので自前でソート関数を作る必要があります。
下記コードは非破壊的ソートの実装例です。

JavaScript

1'use strict'; 2var sortMap = (function () { 3 function eachfn (value, key) { 4 this.push([key, value]); 5 } 6 7 return function sortMap (map, sortfn) { 8 var array = []; 9 10 map.forEach(eachfn, array); 11 return new Map(array.sort(sortfn)); 12 } 13}()); 14 15var map = new Map([['69a560179519', {id: 1, time: '11:00'}], ['1b6507a0111a', {id: 2, time: '13:00'}], ['08dda86dc511', {id: 3, time: '12:00'}]]), 16 array = []; 17 18map = sortMap(map, function sortfn (a, b) { 19 a = a[1].time; 20 b = b[1].time; 21 22 if (a === b) { 23 return 0; 24 } 25 26 return a > b ? 1 : -1; 27}); 28 29for (var entry of map.entries()) { 30 console.log(JSON.stringify(entry)); 31}

Re: hayashiki さん

投稿2016/08/06 14:05

think49

総合スコア18162

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

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

ricy

2016/08/08 11:44

こちらでもいけたかもしれませんが、一旦急ぎだったので別回答者様のやり方で実装いたしました。また改めてMAPで記載して実装もやってみたいと思います、ありがとうございました。
guest

0

ベストアンサー

JavaScriptのオブジェクトは配列と違い、順序の保証は無いと思います。(実装次第)

【オブジェクトのキーの順序 - hogehoge @teramako】
http://d.hatena.ne.jp/teramako/20140205/p1

要するに実装まかせであり、仕様として順序は保証していない。


上記記事にも書かれているリンクですが、こちらが探されているものかと思います。

【【JavaScript】オブジェクトをキーでソートする方法 | Web制作会社スタイル】
http://www.hp-stylelink.com/news/2014/02/20140204.php

投稿2016/08/06 12:43

kei344

総合スコア69398

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

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

ricy

2016/08/08 11:42

kei344様のリンクを一番参考にさせていただきました。 keyでソートを一部変更して実装できました!ありがとうございました。
think49

2016/08/08 13:40

> keyでソートを一部変更して実装できました!ありがとうございました。 それは@teramakoさんのブログ記事を読んだ上での判断でしょうか。 この方法は実装依存であり、実際に@teramakoさんが調べた当時は実装の挙動に違いがあったようです。 この方法を採用するのであれば対象ブラウザ全ての実装の挙動を熟知し、対象ブラウザ全てで問題ないkey値をとるように配慮したコードを書く必要があります。 また、実装依存故にブラウザがアップデートした際に挙動を変更する可能性があり、ある時から急に「Google Chromeで動かなくなった!」な苦情が寄せられる可能性があります。
ricy

2016/08/12 02:21

コメントありがとうございます。 たしかに、いまたまたまこのブラウザのこのバージョンでうまくいっただけかもしれません。実際、別のidでソートすると、オブジェクトがidの昇順でしか表示されませんでした。MAPでも試してみたいと思います。
guest

0

オブジェクトのキーを配列にして、ソート順を保持するのはどうでしょう?
IE8などの古いブラウザではObject.keysは使えませんが・・・

var obj = { "69a560179519" : { "id" : 1, "time" : "11:00" }, "1b6507a0111a" : { "id" : 2, "time" : "13:00" }, "08dda86dc511" : { "id" : 3, "time" : "12:00" } }; //timeでソートした結果のキーを取得 var keys = Object.keys(obj).sort(function(a, b) { return obj[a]["time"] > obj[b]["time"] ? 1 : -1; }); for (var i = 0; i < keys.length; i++) { console.log(obj[keys[i]]["id"]); } //一度きりの処理であれば Object.keys(obj).sort(function(a, b) { return obj[a]["time"] > obj[b]["time"] ? 1 : -1; }).forEach(function(key) { console.log(obj[key]["id"]); }); //順番は保証されませんが、オブジェクト内の順番を変える var sorted = {}; Object.keys(obj).sort(function(a, b) { return obj[a]["time"] > obj[b]["time"] ? 1 : -1; }).forEach(function(key, index) { sorted[key] = obj[key]; }); for (var k in sorted) { console.log(sorted[k]["id"]); }

投稿2016/08/07 02:19

shouyu

総合スコア10

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

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

ricy

2016/08/08 11:45

一度配列にしてやるやり方がよさそうですね。 具体的で大変わかりやすかったです、ありがとうございました。
guest

0

文字配列もオブジェクト配列も比較方法は同じですよ

js

1str1 < str2

で比較しているところを

js

1item1.str < item2.str

で比較するだけですから

投稿2016/08/06 12:47

asahina_dev

総合スコア610

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

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

ricy

2016/08/08 11:42

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問