2016-10-15 8 views
1

こんにちは、チャットアプリケーションで作業している、私は新しいメッセージを並べ替えると時間の経過に従って履歴の順序を維持したい。Javascript sort array in order

たとえば、私はこのような配列のチャットメッセージを持っていますが、今は各メッセージオブジェクトの "time"キーを使ってそれらを並べ替えています!

[{"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}] 

どのように私はまた、すべての偽の値が上に来る必要がありますが、残りのオブジェクトは、「時間」キーでソートする必要があるキーを「読み」を使用して、それらを並べ替えることができます。あなたはソート順とチェーン希望sortパラメータのため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

私は読取りメッセージと読まない配列を1つに分割し、それらを独立して並べ替えることから始めます。このようにして、完成したソーターを使用することができます。あるいは特定のコードを探していますか? – Ozgar

答えて

5

のような例えば

このコールバックでは、booleanとnumberの暗黙的な変換を計算に使用します。

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; }

+1

こんにちは私はあなたが他の方法でそれをやっていると思う、偽の値はトップに行く必要があります – Tuna

+0

@ツナ、右、それを逃した。 –

+1

スーパーニート!私はそれが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

また、赤のメッセージとunredもののために別の配列のいずれかに作成することができます。すべてなおさらのメッセージがすでに時間によってソートされているので、:

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値をソートお勧めします。

それ以外の場合は、安定したソートアルゴリズム(マージソートなど)を使用して配列を2回並べ替えることができます。最初に「時間」キー、次に「読み取り」キーを押します。

PS:アンダースコアjs(https://github.com/jashkenas/underscore)は、安定していると主張するsortBy関数を提供します。

PPS:あなたは1つのソートと正確にこれをしたい場合は、どのようにあなたが今、ソートされている2つのキーcompare_key_generator = function(o){return o.read.toString()+o.time}