Kann mir jemand helfen, ein zweidimensionales Array in JavaScript zu sortieren?
Es werden Daten im folgenden Format vorliegen:
[12, AAA]
[58, BBB]
[28, CCC]
[18, DDD]
Beim Sortieren sollte es so aussehen:
[12, AAA]
[18, DDD]
[28, CCC]
[58, BBB]
Also im Grunde nach der ersten Spalte sortieren.
Prost
Antworten:
So einfach ist das:
var a = [[12, 'AAA'], [58, 'BBB'], [28, 'CCC'],[18, 'DDD']]; a.sort(sortFunction); function sortFunction(a, b) { if (a[0] === b[0]) { return 0; } else { return (a[0] < b[0]) ? -1 : 1; } }
Ich lade Sie ein, die Dokumentation zu lesen .
Wenn Sie nach der zweiten Spalte sortieren möchten, können Sie dies tun:
a.sort(compareSecondColumn); function compareSecondColumn(a, b) { if (a[1] === b[1]) { return 0; } else { return (a[1] < b[1]) ? -1 : 1; } }
quelle
<
oder>
. Wie auch immer, ich mag das Update :)Der beste Ansatz wäre, Folgendes zu verwenden, da sich in der ersten Spalte möglicherweise sich wiederholende Werte befinden.
var arr = [[12, 'AAA'], [12, 'BBB'], [12, 'CCC'],[28, 'DDD'], [18, 'CCC'],[12, 'DDD'],[18, 'CCC'],[28, 'DDD'],[28, 'DDD'],[58, 'BBB'],[68, 'BBB'],[78, 'BBB']]; arr.sort(function(a,b) { return a[0]-b[0] });
quelle
Versuche dies
//WITH FIRST COLUMN arr = arr.sort(function(a,b) { return a[0] - b[0]; }); //WITH SECOND COLUMN arr = arr.sort(function(a,b) { return a[1] - b[1]; });
Hinweis: Bei der ursprünglichen Antwort wurde ein Größer als (>) anstelle von Minus (-) verwendet, was in den Kommentaren als falsch bezeichnet wird.
quelle
Verwenden der Pfeilfunktion und Sortieren nach dem zweiten Zeichenfolgenfeld
var a = [[12, 'CCC'], [58, 'AAA'], [57, 'DDD'], [28, 'CCC'],[18, 'BBB']]; a.sort((a, b) => a[1].localeCompare(b[1])); console.log(a)
quelle
Wenn Sie so etwas wie ich sind, möchten Sie nicht jedes Mal, wenn Sie die Spalte ändern möchten, nach der Sie sortieren, jeden Index ändern.
function sortByColumn(a, colIndex){ a.sort(sortFunction); function sortFunction(a, b) { if (a[colIndex] === b[colIndex]) { return 0; } else { return (a[colIndex] < b[colIndex]) ? -1 : 1; } } return a; } var sorted_a = sortByColumn(a, 2);
quelle
Nichts Besonderes, nur die Kosten zu sparen, die erforderlich sind, um einen Wert für einen bestimmten Index aus einem Array zurückzugeben.
function sortByCol(arr, colIndex){ arr.sort(sortFunction) function sortFunction(a, b) { a = a[colIndex] b = b[colIndex] return (a === b) ? 0 : (a < b) ? -1 : 1 } } // Usage var a = [[12, 'AAA'], [58, 'BBB'], [28, 'CCC'],[18, 'DDD']] sortByCol(a, 0) console.log(JSON.stringify(a)) // "[[12,"AAA"],[18,"DDD"],[28,"CCC"],[58,"BBB"]]"
quelle
a[colIndex]
immer wieder, aber ich fange es hiera = a[colIndex]
. Es ist effizienter. 2. Ich verwende verschiedene Geschmacksrichtungen vonif
, wodurch es kürzer wird. 3. Ich kehrearr
aufgrund einersortByCol
Funktion nicht zurück, was bedeutet, dass meine Funktion nicht zum Erstellen einer weiteren Referenz verwendet werden kann. Ich hoffe es hilft!in einer Zeile:
var cars = [ {type:"Volvo", year:2016}, {type:"Saab", year:2001}, {type:"BMW", year:2010} ] function myFunction() { return cars.sort((a, b)=> a.year - b.year) }
quelle
Wenn Sie nach der ersten Spalte sortieren möchten (die den Zahlenwert enthält ), versuchen Sie Folgendes:
arr.sort(function(a,b){ return a[0]-b[0] })
Wenn Sie nach der zweiten Spalte sortieren möchten (die einen Zeichenfolgenwert enthält ), versuchen Sie Folgendes:
arr.sort(function(a,b){ return a[1].charCodeAt(0)-b[1].charCodeAt(0) })
PS Für den zweiten Fall müssen Sie zwischen ihren ASCII-Werten vergleichen.
Hoffe das hilft.
quelle
Da mein Anwendungsfall Dutzende von Spalten umfasst, habe ich die Antwort von @ jahroy ein wenig erweitert. (Ich habe auch gerade festgestellt, dass @ charles-Clayton die gleiche Idee hatte.)
Ich übergebe den Parameter, nach dem ich sortieren möchte, und die Sortierfunktion wird mit dem gewünschten Index neu definiert, damit der Vergleich stattfinden kann.
var ID_COLUMN=0 var URL_COLUMN=1 findings.sort(compareByColumnIndex(URL_COLUMN)) function compareByColumnIndex(index) { return function(a,b){ if (a[index] === b[index]) { return 0; } else { return (a[index] < b[index]) ? -1 : 1; } } }
quelle
Ich stand auf den Schultern von Charles-Clayton und @ Vikas-Gautam und fügte den Stringtest hinzu, der erforderlich ist, wenn eine Spalte Strings wie in OP enthält.
return isNaN(a-b) ? (a === b) ? 0 : (a < b) ? -1 : 1 : a-b ;
Der Test stellt
isNaN(a-b)
fest, ob die Zeichenfolgen nicht zu Zahlen gezwungen werden können. Wenn sie können, ist dera-b
Test gültig.Beachten Sie, dass das Sortieren einer Spalte mit gemischten Typen immer ein unterhaltsames Ergebnis liefert, da der strenge Gleichheitstest
(a === b)
immer false zurückgibt. Siehe MDN hierDies ist das vollständige Skript mit Logger-Test - unter Verwendung von Google Apps Script.
function testSort(){ function sortByCol(arr, colIndex){ arr.sort(sortFunction); function sortFunction(a, b) { a = a[colIndex]; b = b[colIndex]; return isNaN(a-b) ? (a === b) ? 0 : (a < b) ? -1 : 1 : a-b ; // test if text string - ie cannot be coerced to numbers. // Note that sorting a column of mixed types will always give an entertaining result as the strict equality test will always return false // see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness } } // Usage var a = [ [12,'12', 'AAA'], [12,'11', 'AAB'], [58,'120', 'CCC'], [28,'08', 'BBB'], [18,'80', 'DDD'], ] var arr1 = a.map(function (i){return i;}).sort(); // use map to ensure tests are not corrupted by a sort in-place. Logger.log("Original unsorted:\n " + JSON.stringify(a)); Logger.log("Vanilla sort:\n " + JSON.stringify(arr1)); sortByCol(a, 0); Logger.log("By col 0:\n " + JSON.stringify(a)); sortByCol(a, 1); Logger.log("By col 1:\n " + JSON.stringify(a)); sortByCol(a, 2); Logger.log("By col 2:\n " + JSON.stringify(a)); /* vanilla sort returns " [ [12,"11","AAB"], [12,"12","AAA"], [18,"80","DDD"], [28,"08","BBB"], [58,"120","CCC"] ] if col 0 then returns "[ [12,'12',"AAA"], [12,'11', 'AAB'], [18,'80',"DDD"], [28,'08',"BBB"], [58,'120',"CCC"] ]" if col 1 then returns "[ [28,'08',"BBB"], [12,'11', 'AAB'], [12,'12',"AAA"], [18,'80',"DDD"], [58,'120',"CCC"], ]" if col 2 then returns "[ [12,'12',"AAA"], [12,'11', 'AAB'], [28,'08',"BBB"], [58,'120',"CCC"], [18,'80',"DDD"], ]" */ }
quelle