2017-11-08 5 views
0

タイムスタンプでJavascriptオブジェクトを正しく並べ替えることができないようです。私はこの投稿から考えを得たhereとこの投稿:hereタイムスタンプでjavascriptオブジェクトを並べ替える方法

問題:

1) object is already sorted on console log for some reason 
2) sorting seems to have had no effect 

コード:

var map = {1505932515: "some item", 1505932695: "some item", 1505832202: "some item", 1508425777: "some item", 1508872138: "some item", 1509022385: "some item", 1509034662: "some item"} 
console.log(map); // Why is this already sorted anyway 

var sortedMap = {}; 
Object.keys(map).sort().reverse().forEach(function(key) { 
sortedMap[key] = map[key]; 
}); 
console.log(sortedMap); 

ライブテスト:JS Bin

これは、Google Chromeの上のテストがあります。

+0

あなたの最終的な結果は何をすべきですか?ちょうどタイムスタンプまたはタイムスタンプでソートされたオブジェクト? – JohanP

+0

タイムスタンプでソートされた@JohanPオブジェクト –

+0

JavaScriptオブジェクトキーは文字列です。キャストの後に、関数が '.sort(function(a、b){return a-b;}) 'に渡され、数値が正しく機能するようにする必要があります。 – PHPglue

答えて

0

sortの機能は、あなたがやっている方法では、stringsをソートしているので、番号に変換する必要があります。 PHPGlueが言及しているように、あなたのオブジェクトは挿入命令を気にせず、ネイティブの実装がしなければならないことだけを行います。したがって、降順で挿入すると、降順で戻ってくることはありません。ただし、Mapは注文を尊重します。 sort機能で+オペレータが文字列を数値に変換する簡単な方法です

var map = {1505932515: "some item", 1505932695: "some item", 1505832202: "some item", 1508425777: "some item", 1508872138: "some item", 1509022385: "some item", 1509034662: "some item"}; 
 

 
var map = Object.keys(map).sort(function(a,b){ return +b - +a;}).reduce(function(t,k) { 
 
    t.set(k,map[k]); 
 
    return t; 
 
},new Map()); 
 

 
map.forEach(function(v,k) { 
 
console.log(k,v); 
 
});

:あなたはこれを行うことができます。

+0

これは動作していませんか? https://jsbin.com/cogajirome/edit?html,js,console,output –

+0

es6以外の構文のために編集 – JohanP

+0

クールですが、とにかく最後にn個のマップの代わりに1個のマップしか持たないのですか? https://jsbin.com/vuneqegoxa/edit?js,console –

0

私のコメントを読んでください。ここで私はどうなるのかです:

//<![CDATA[ 
 
/* external.js */ 
 
var doc, bod, E, old = onload; // for reuse onload 
 
onload = function(){ 
 
if(old)old(); // change var name if using technique on other pages 
 
doc = document; bod = doc.body; 
 
E = function(id){ 
 
    return doc.getElementById(id); 
 
} 
 
var map = {1505932515:'was first', 1505932695:'was second', 1505832202:'was third', 1508425777:'was fourth', 1508872138:'was fifth', 1509022385:'was sixth', 1509034662:'was seventh'}; 
 
var out = E('out'), keysInOrder = []; 
 
for(var i in map){ 
 
    keysInOrder.push(+i); 
 
} 
 
keysInOrder.sort(function(a, b){ 
 
    return a-b; 
 
}); 
 
for(var i=0,k,l=keysInOrder.length; i<l; i++){ 
 
    k = keysInOrder[i]; out.innerHTML += k+' : '+map[k]+'<br />'; 
 
} 
 
} 
 
//]]>
/* external.css */ 
 
html,body{ 
 
    padding:0; margin:0; background:#000; 
 
} 
 
.main{ 
 
    width:940px; background:#fff; padding:20px; margin:0 auto; 
 
}
<!DOCTYPE html> 
 
<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en'> 
 
    <head> 
 
    <meta http-equiv='content-type' content='text/html;charset=utf-8' /> 
 
    <meta name='viewport' content='width=device-width' /> 
 
    <title>Sort an Object by Numeric Keys</title> 
 
    <link type='text/css' rel='stylesheet' href='external.css' /> 
 
    <script type='text/javascript' src='external.js'></script> 
 
    </head> 
 
    <body> 
 
    <div class='main'> 
 
     <div id='out'></div> 
 
    </div> 
 
    </body> 
 
</html>

+0

あなたはこの方法で配列をソートしていますが、それでも問題はありませんが、値を保持したいのですが –

+0

私はいくつか変更しました。今はどう?ところでオブジェクトオブジェクトはソートできません。反復は、ブラウザに適した順序で表示されます。 – PHPglue

1
const map = { 
    1505932515: "some item", 
    1505932695: "some item", 
    1505832202: "some item", 
    1508425777: "some item", 
    1508872138: "some item", 
    1509022385: "some item", 
    1509034662: "some item" 
}; 
let sorted = Object.keys(map).sort((a,b) => b - a).reduce((ac, item) => { ac.set(item,map[item]); return ac } , new Map()); 
関連する問題