2016-10-15 2 views
1

안녕하세요. 채팅 응용 프로그램에서 작업 중입니다. 새 메시지를 정렬하고 시간별로 기록 순서를 유지하려고합니다.Javascript sort array in order

예를 들어, 나는이 메시지를 배열에 담아 채팅 메시지를 각 메시지 객체의 "시간"키를 사용하여 정렬합니다. 난 모든 거짓 값은 최고지만 나머지 객체에 와야 "읽기"키를 사용하여 정렬 할 수 있습니다 방법

[{"user":"a", "msg":"Hi ", "read":true, "time":1} 
{"user":"b", "msg":"Hi ", "read":false, "time":2} 
{"user":"c", "msg":"Hi ", "read":false, "time":3} 
{"user":"d", "msg":"Hi ", "read":true, "time":4} 
{"user":"e", "msg":"Hi ", "read":true, "time":5}] 

은 "시간"키를 정렬해야합니다. 당신은 Array#sort 사용할 수있는이

[{"user":"b", "msg":"Hi ", "read":false, "time":2} 
{"user":"c", "msg":"Hi ", "read":false, "time":3} 
{"user":"a", "msg":"Hi ", "read":true, "time":1} 
{"user":"d", "msg":"Hi ", "read":true, "time":4} 
{"user":"e", "msg":"Hi ", "read":true, "time":5}] 
+0

의 조합을 사용합니까? – Amit

+0

배열을 하나의 읽기 메시지로 분할하고 하나는 읽지 않은 채로 독립적으로 정렬하여 시작합니다. 이렇게하면 완성 된 분류기를 계속 사용할 수 있습니다. 아니면 특정 코드를 찾으십니까? – Ozgar

답변

5

및 정렬 순서에 대한 콜백 및 체인 등의 예를 들어

정렬 매개 변수를 원했다.

이 콜백은 부울과 숫자의 암시 적 변환을 계산과 함께 사용합니다.

var array = [{ "user": "a", "msg": "Hi ", "read": true, "time": 1 }, { "user": "b", "msg": "Hi ", "read": false, "time": 2 }, { "user": "c", "msg": "Hi ", "read": false, "time": 3 }, { "user": "d", "msg": "Hi ", "read": true, "time": 4 }, { "user": "e", "msg": "Hi ", "read": true, "time": 5 }]; 
 

 
array.sort(function (a, b) { 
 
    return a.read - b.read || a.time - b.time; 
 
}); 
 

 
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }
또한 unred 사람을위한 빨간색 메시지 배열, 다른 하나를 만들 수

+1

이봐 요, 당신이 다른 방향으로 돌리고 있다고 생각합니다. 거짓 값은 상단에 가야합니다. – Tuna

+0

@Tuna, 맞습니다. –

+1

슈퍼 깔끔한! 나는 그것이 하나의 라이너라고 말하고 싶다. – Tuna

0

var data = [{"user":"a", "msg":"Hi ", "read":true, "time":1}, 
 
{"user":"b", "msg":"Hi ", "read":false, "time":2}, 
 
{"user":"c", "msg":"Hi ", "read":false, "time":3}, 
 
{"user":"d", "msg":"Hi ", "read":true, "time":4}, 
 
{"user":"e", "msg":"Hi ", "read":true, "time":5}]; 
 

 
data.sort((a, b) => { 
 
    if (a.read === b.read) { 
 
    return a.time - b.time; 
 
    } 
 
    return a.read ? 1 : -1; 
 
}); 
 

 
data.forEach(x => console.log(JSON.stringify(x)));

0

. 모든 더욱 그렇다 메시지는 이미 시간으로 분류되어 있기 때문에 :

var chat = [{"user":"b", "msg":"Hi ", "read":false, "time":2}, {"user":"c", "msg":"Hi ", "read":false, "time":3}, {"user":"a", "msg":"Hi ", "read":true, "time":1}, {"user":"d", "msg":"Hi ", "read":true, "time":4}, {"user":"e", "msg":"Hi ", "read":true, "time":5}]; 

var chatRed = chat.filter(x => x.read); 
var chatNotRed = chat.filter(x => !x.read); 

console.log(chatNotRed); 
console.log(chatRed); 
0

나는 가능하면 별도로 "read":false"read:true 값을 정렬 추천 해드립니다.

그렇지 않으면 안정적인 정렬 알고리즘 (예 : 병합 정렬)을 사용하여 배열을 두 번 정렬 할 수 있습니다. 먼저 '시간'키를 누른 다음 '읽기'키를 누릅니다.

추 신 : 밑줄 js (https://github.com/jashkenas/underscore)는 stable이라고 주장하는 sortBy 기능을 제공합니다.

PPS : 한 종류로 정확하게이 작업을 수행하려면, 어떻게 지금 정렬 된 두 개의 키 compare_key_generator = function(o){return o.read.toString()+o.time}