2017-11-08 1 views
0

자바 스크립트 객체를 타임 스탬프만큼 올바르게 정렬하지 못하는 것 같습니다. 나는이 게시물에서 아이디어를 얻었습니다 here 및이 게시물 : here.타임 스탬프로 자바 스크립트 객체를 역순으로 정렬하는 방법

문제 :

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

이 구글 크롬에 대한 테스트입니다.

+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()); 
관련 문제