2016-05-22 10 views
-2

Wenn ich mein Array von Objekten nach irgendeiner Spalte sortiere, funktioniert es gut ... bis meine array.length> 10 ... auf google chrome (funktioniert immer noch gut in Firefox).javascript array length> 10 sortierung google chrome

EDIT: Das Problem, wenn die Länge des Arrays 10 überschreitet, ist, dass die Sortierung einfach "zufällig" mein Array sortiert.

Also überprüfte ich, ob meine Sortierfunktionen etwas Gültiges zurückgaben (0, negative oder positive Ganzzahl) und ja, das tun sie.

Ich habe diese

console.log(a.wins - b.wins); // when comparing integers 
console.log(a.name.localeCompare(b.name, undefined, {sensitivity: 'base'})); // when comparing strings 

die Ausgänge i in meiner Konsole hatten, waren nur Zahlen ein einfaches console.log direkt vor der Rückkehr, indem Sie (-1, 0 oder 1 für Streicher Comparaisons & von -5 bis 140 für ganzzahlige Vergleiche)

Irgendeine Idee, um mein Problem zu lösen?

EDIT2: na ja, lassen Sie uns versuchen, einige Code zu setzen, hier ist der Code, wenn ich Benutzernamen zum Beispiel vergleichen

// So, when I click on Username column of my table, it calls this function 
// The array I need to sort & display is: summoners 
// You can see that I'm doing something weird in case my username is empty, 
// that's the way I found to put blank names after the 'z' letter so they 
// appear at the end of the list when sorted ascending 
if (jQuery(this).html() == 'Username'){ 
    var clonedSummoners = _.map(summoners, _.clone); 
    summoners = summoners.sort(function(a, b){ 
     var first, second; 
     if (a.Username == '') 
      first = 'zzzzzzzzzzzzzzzzzzzzzz'; 
     else 
      first = a.Username; 
     if (b.Username == '') 
      second = 'zzzzzzzzzzzzzzzzzzzzzz'; 
     else 
      second = b.Username; 
     console.log(first.localeCompare(second, undefined, {sensitivity: 'base'})); 
     return first.localeCompare(second, undefined, {sensitivity: 'base'}); 
    }); 
    var testSort = true; 
    for(var i=0; i<summoners.length; i++) 
     if (summoners[i].id != clonedSummoners[i].id) 
      testSort = false; 
    if (testSort == true) 
     summoners = summoners.reverse(); 
} 

drawSummoners(); 

EDIT 3: So, hier ist das, was ich & will, was ich bekommen:

sagen wir, mein Array ist:

summoners = [ 
    {'username' : 'calpton', 'age' : 19}, 
    {'username' : 'comics', 'age' : 12}, 
    {'username' : 'hello', 'age' : 17}, 
    {'username' : 'newyork', 'age' : 47}, 
    {'username' : 'physics', 'age' : 14}, 
    {'username' : '', 'age' : 1}, 
    {'username' : 'azerty', 'age' : 2}, 
    {'username' : 'bob', 'age' : 5}, 
    {'username' : 'hello', 'age' : 37}, 
    {'username' : 'henry', 'age' : 17}, 
    {'username' : 'therapy', 'age' : 27} 
]; 

nach Kalli ng meine Funktion oben, würde ich meine Beschwörer Array wie auf diese Weise sortiert werden

summoners = [ 
    {'username' : 'azerty', 'age' : 2}, 
    {'username' : 'bob', 'age' : 5}, 
    {'username' : 'calpton', 'age' : 19}, 
    {'username' : 'comics', 'age' : 12}, 
    {'username' : 'hello', 'age' : 17}, // it doesn't matter 
    {'username' : 'hello', 'age' : 37}, // for these ones 
    {'username' : 'henry', 'age' : 17}, 
    {'username' : 'newyork', 'age' : 47}, 
    {'username' : 'physics', 'age' : 14}, 
    {'username' : 'therapy', 'age' : 27}, 
    {'username' : '', 'age' : 1}, 
]; 

aber ich werde stattdessen erhalten:

summoners = [ 
    {'username' : 'calpton', 'age' : 19}, 
    {'username' : 'bob', 'age' : 5}, 
    {'username' : 'hello', 'age' : 37}, 
    {'username' : 'henry', 'age' : 17}, 
    {'username' : 'comics', 'age' : 12}, 
    {'username' : 'hello', 'age' : 17}, 
    {'username' : 'newyork', 'age' : 47}, 
    {'username' : 'physics', 'age' : 14}, 
    {'username' : '', 'age' : 1}, 
    {'username' : 'azerty', 'age' : 2}, 
    {'username' : 'therapy', 'age' : 27} 
]; 

so, ich denke, es ist nicht zufällig, weil es wird immer es irgendwie auf diese Weise, aber die Art macht keinen Sinn.

Edit4: nein, Benutzername nicht zurück undefined

get Username(){ 
    if (typeof this.username == 'undefined') 
     return ''; 
    else return this.username; 
} 

Ich bin im Rahmen einer Klasse

FINAL EDIT: OK, fand ich heraus, was das Problem ist, Das Problem ist, dass mein Array ein komplexes Array von Objekten ist. Ich habe versucht, es nach einer Eigenschaft zu sortieren, aber manchmal hatte ich diese Eigenschaft für 7 von 11 Objekten auf dem gleichen Wert. Das Problem, das ich in Chrome hatte, war, dass Google Chrome nicht immer die Werte sortiert, die in der gleichen Reihenfolge gleich sind, während Firefox immer die gleiche Reihenfolge behält. In meinem Code (unter Edit2) überprüfe ich, ob das Array bereits sortiert ist, und wenn ja, mache ich es rückgängig, es funktionierte gut in Firefox, weil es immer das gleiche war, in Chrome war es nicht. Ich verstehe immer noch nicht, wie es die anfängliche Art vermasseln könnte, aber gut, ich fügte einfach eine zweite Art auf eine Eigenschaft hinzu, von der ich wusste, dass sie einzigartig sein würde und alles löste.

return first.localeCompare(second, undefined, {sensitivity: 'base'}) || a.name.localeCompare(b.name, undefined, {sensitivity: 'base'}); 

der Name ist immer da und einzigartig dort, so dass mein Array immer auf die gleiche Weise sortiert wird.

+0

Können Sie ein Code-Snippet posten, das Ihr Problem direkt demonstriert? – Frxstrem

+1

Bis jetzt haben Sie das Problem nicht beschrieben. Was ist das Problem? Es gibt undefined zurück? Es gibt ein leeres Array zurück? Es hat nicht sortiert? Wenn es nicht sortieren würde, wäre es sicher, dass es nicht sortiert (hat sich überhaupt nicht geändert) oder hat es in einer unerwarteten Reihenfolge sortiert? – slebetman

+0

sorry @slebetman, Ich habe meinen Beitrag bearbeitet, um Ihre Frage zu beantworten – PineApple34

Antwort

0

Nun, ich habe es in Chrome v51 wie folgt getan und das Ergebnis ist wie erwartet.

var summoners = [ 
 
    {'username' : 'calpton', 'age' : 19}, 
 
    {'username' : 'comics', 'age' : 12}, 
 
    {'username' : 'hello', 'age' : 17}, 
 
    {'username' : 'newyork', 'age' : 47}, 
 
    {'username' : 'physics', 'age' : 14}, 
 
    {'username' : '', 'age' : 1}, 
 
    {'username' : 'azerty', 'age' : 2}, 
 
    {'username' : 'bob', 'age' : 5}, 
 
    {'username' : 'hello', 'age' : 37}, 
 
    {'username' : 'henry', 'age' : 17}, 
 
    {'username' : 'therapy', 'age' : 27} 
 
], 
 

 
    sorted = summoners.sort((a,b) => { var f = a.username || "zzz", 
 
              s = b.username || "zzz"; 
 
             return f.localeCompare(s, void 0, {sensitivity: "base"}); 
 
            }); 
 
console.log(sorted);

P. S. Sie müssen die undefinierten Benutzernamen für das obige Snippet nicht in "" konvertieren.

+0

Vielen Dank. Ich habe deine Antwort verbessert, aber ich kann sie nicht validieren, da es nicht die Lösung für mein Problem ist, aber du hast mich dazu gebracht, es erneut zu versuchen, also habe ich herausgefunden, was los war, werde meinen Beitrag bearbeiten, um es zu zeigen. – PineApple34

+0

@ PineApple34: cool .. Ich bin neugierig auf die Lösung. Lass uns wissen, wo das Problem ist. – Redu