Czy ktoś może mi pomóc w sortowaniu dwuwymiarowej tablicy w JavaScript?
Będzie zawierał dane w następującym formacie:
[12, AAA]
[58, BBB]
[28, CCC]
[18, DDD]
Po posortowaniu powinno wyglądać tak:
[12, AAA]
[18, DDD]
[28, CCC]
[58, BBB]
Zasadniczo sortowanie według pierwszej kolumny.
Twoje zdrowie
Odpowiedzi:
To takie proste:
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; } }
Zapraszam do zapoznania się z dokumentacją .
Jeśli chcesz posortować według drugiej kolumny, możesz to zrobić:
a.sort(compareSecondColumn); function compareSecondColumn(a, b) { if (a[1] === b[1]) { return 0; } else { return (a[1] < b[1]) ? -1 : 1; } }
źródło
<
lub>
. W każdym razie podoba mi się aktualizacja :)Najlepszym podejściem byłoby użycie następujących, ponieważ w pierwszej kolumnie mogą występować powtarzające się wartości.
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] });
źródło
Spróbuj tego
//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]; });
Uwaga: Oryginalna odpowiedź zawierała większe niż (>) zamiast minus (-), co jest określane w komentarzach jako niepoprawne.
źródło
Korzystanie z funkcji strzałek i sortowanie według drugiego pola ciągu
var a = [[12, 'CCC'], [58, 'AAA'], [57, 'DDD'], [28, 'CCC'],[18, 'BBB']]; a.sort((a, b) => a[1].localeCompare(b[1])); console.log(a)
źródło
Jeśli jesteś podobny do mnie, nie będziesz chciał przechodzić przez zmianę każdego indeksu za każdym razem, gdy chcesz zmienić kolumnę, według której sortujesz.
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);
źródło
Nic specjalnego, po prostu oszczędzamy koszt potrzebny do zwrócenia wartości o określonym indeksie z tablicy.
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"]]"
źródło
a[colIndex]
wielokrotnie, ale łapię to tutaja = a[colIndex]
. Jest bardziej wydajna. 2. Używam innego smakuif
, przez co jest krótszy. 3. Nie zwracamarr
wyniku w wyniku działaniasortByCol
funkcji, co oznacza, że nie można użyć mojej funkcji do utworzenia innego odwołania. Mam nadzieję, że to pomoże!w jednej linii:
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) }
źródło
Jeśli chcesz posortować według pierwszej kolumny (która zawiera numer wartość), a następnie spróbuj tego:
arr.sort(function(a,b){ return a[0]-b[0] })
Jeśli chcesz sortować na podstawie drugiej kolumny (która zawiera ciąg wartość ), spróbuj tego:
arr.sort(function(a,b){ return a[1].charCodeAt(0)-b[1].charCodeAt(0) })
PS w drugim przypadku musisz porównać ich wartości ASCII.
Mam nadzieję że to pomoże.
źródło
Ponieważ mój przypadek użycia obejmuje dziesiątki kolumn, rozszerzyłem nieco odpowiedź @ jahroy. (właśnie zdałem sobie sprawę, że @ charles-clayton miał ten sam pomysł).
Przekazuję parametr, według którego chcę sortować, a funkcja sortowania jest ponownie definiowana z żądanym indeksem, aby miało miejsce porównanie.
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; } } }
źródło
Stojąc na ramionach Charlesa-Claytona i @ vikas-gautam, dodałem test strun, który jest potrzebny, jeśli kolumna ma struny jak w OP.
return isNaN(a-b) ? (a === b) ? 0 : (a < b) ? -1 : 1 : a-b ;
Test
isNaN(a-b)
określa, czy ciągów nie można przekształcić w liczby. Jeśli tak,a-b
test jest ważny.Zwróć uwagę, że sortowanie kolumny typów mieszanych zawsze da zabawny wynik, ponieważ test ścisłej równości
(a === b)
zawsze zwróci fałsz. Zobacz MDN tutajTo jest pełny skrypt z testem Loggera - przy użyciu 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"], ]" */ }
źródło