以下のようなオブジェクトがあり、
Object {69a560179519: { id: 1, time:11:00}, 1b6507a0111a: { id: 2, time:13:00}, 08dda86dc511{ id: 3, time:12:00}}
time順にソートしたいのですが、いろいろ調べても
配列のソートはでてくるのですがオブジェクトについてのっておらず、
ご教示いただけないでしょうか。
※keyについては乱数なのでとくに気にされないでください
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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
総合スコア18162
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
総合スコア69398
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/08/08 13:40
2016/08/12 02:21
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
総合スコア10
0
文字配列もオブジェクト配列も比較方法は同じですよ
js
1str1 < str2
で比較しているところを
js
1item1.str < item2.str
で比較するだけですから
投稿2016/08/06 12:47
総合スコア610
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/08/08 11:44