2017-09-24 4 views
0

Ich habe Probleme mit dieser Art. Ich habe ein Array mit Werten wie folgt aus:Wie sortiere ich diese Art von Array richtig?

array = [ {SortTime : 123456, Operation : Assigning}, {SortTime : 4567 , Operation: Assigning}, {SortTime : 123456 , Operation: Assigned} ]; 

Wenn ich also Array vergleichen [0] und array [2] Ich möchte halten, so dass ich „Zuweisung“ vor der „Assigned“

Jede dieser Zahlen ist eine Epoche, also brauche ich, wenn der Algorithmus mit zwei gleichwertigen Zahlen arbeitet, die gleiche ursprüngliche Reihenfolge für diese beiden Zahlen (wenn ich Array [4] = 12345 und Array [5] = 12345 habe, Ich möchte, dass Array [4] und Array [5] in der Reihenfolge Array [5] und Array [4] werden.

Dies funktioniert nicht, weil oft Position zwischen Gleichheitszahl tauschen. Es tut mir leid, wenn meine Erklärung schlecht ist. Vielen Dank im Voraus!

+0

Sie müssen BigInteger in diesem Fall – bigbounty

+0

_ "verwenden (wenn ich Array [4] = 12345 und array [5 ] = 12345, ich möchte, dass das Array [4] und das Array [5] in der Reihenfolge nicht zu Array [5] und Array [4] werden. "_ Wie würdest Du den Unterschied kennen? Oder ist die Variable 'array' bei Question keine genaue Darstellung des tatsächlichen Arrays? – guest271314

+0

Ihre Beispieldaten sind falsch und machen die Frage sinnlos. – glennsl

Antwort

0

Sie auf die Objekte einen Index Eigenschaft könnte hinzufügen und sortieren nach Zeit und dann durch den Index zu halten, die Beziehung von gleichen Zeitpunkten.

Das Ergebnis ist ein stabiles Ergebnis, wegen des verwendeten Index.

var array = [ 
 
     { SortTime: 123456, Operation: 'Assigning', index: 0 }, 
 
     { SortTime: 4567, Operation: 'Assigning', index: 1 }, 
 
     { SortTime: 123456, Operation: 'Assigned', index: 2 } 
 
    ]; 
 

 
array.sort(function (a, b) { 
 
    return a.SortTime - b.SortTime || a.index - b.index; 
 
}); 
 

 
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+1

Das hat funktioniert !! Vielen Dank – Vins

0

Die Spezifikation für Array.sort tut nicht garantieren, dass die Reihenfolge von zwei Elementen beibehalten wird, wenn Sie 0 von der Funktion zurückgeben. Es hängt von der Implementierung ab, ob ihre Reihenfolge beibehalten wird. Viele Implementierungen bewahren es, andere nicht.

In Ihrem Fall, mit ganzen Zahlen, sehe ich nicht, wie das bedeuten würde. Aber wenn Sie einen Fall mit Objekten haben und wirklich die Reihenfolge der Dinge, die als "gleich" gelten, wirklich bewahren müssen, dann müssen Sie vielleicht Ihre eigene Sorte schreiben. Insbesondere möchten Sie einen "stabilen" Sortieralgorithmus implementieren.

0

Was Sie wollen, ist eine stabile Sorte. Siehe Wikipedia für eine Liste von stable sort algorithms

hier ein merge sort implementation from Rosetta Code:

function merge(left, right, arr) { 
 
    var a = 0; 
 
    
 
    while (left.length && right.length) { 
 
    arr[a++] = (right[0] < left[0]) ? right.shift() : left.shift(); 
 
    } 
 
    while (left.length) { 
 
    arr[a++] = left.shift(); 
 
    } 
 
    while (right.length) { 
 
    arr[a++] = right.shift(); 
 
    } 
 
} 
 
    
 
function mergeSort(arr) { 
 
    var len = arr.length; 
 
    
 
    if (len === 1) { return; } 
 
    
 
    var mid = Math.floor(len/2), 
 
     left = arr.slice(0, mid), 
 
     right = arr.slice(mid); 
 
    
 
    mergeSort(left); 
 
    mergeSort(right); 
 
    merge(left, right, arr); 
 
} 
 
    
 
var arr = [1, 5, 2, 7, 3, 9, 4, 6, 8]; 
 
console.log(arr); 
 
mergeSort(arr) 
 
console.log(arr);

0

Es gibt Arbeitsbeispiel bei JSBin

var arr = [ 
    { 
     SortTime: 123456, 
     Operation: 'first operator' 
    }, { 
     SortTime: 4567, 
     Operation: Assigning 
    }, { 
     SortTime: 123456, 
     Operation: 'second operator' 
    }]; 

var copy = [...arr]; 

copy.sort(function(a, b) { 
    if (a.val.SortTime === b.val.SortTime) { 
     return arr.indexOf(a) - arr.indexOf(b); 
    } else { 
     return a.val.SortTime - b.val.SortTime; 
    } 
});