Может ли кто-нибудь помочь мне отсортировать двухмерный массив в JavaScript?
В нем будут данные в следующем формате:
[12, AAA]
[58, BBB]
[28, CCC]
[18, DDD]
При сортировке он должен выглядеть так:
[12, AAA]
[18, DDD]
[28, CCC]
[58, BBB]
В общем, сортировка по первому столбцу.
Ура
Ответы:
Это просто:
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; } }
Приглашаю ознакомиться с документацией .
Если вы хотите отсортировать по второму столбцу, вы можете сделать это:
a.sort(compareSecondColumn); function compareSecondColumn(a, b) { if (a[1] === b[1]) { return 0; } else { return (a[1] < b[1]) ? -1 : 1; } }
источник
<
или>
. В любом случае, мне нравится обновление :)Лучшим подходом будет использование следующего, поскольку в первом столбце могут быть повторяющиеся значения.
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] });
источник
попробуй это
//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]; });
Примечание: в исходном ответе использовалось больше (>) вместо минуса (-), что в комментариях называется неправильным.
источник
Использование функции стрелки и сортировка по второму строковому полю
var a = [[12, 'CCC'], [58, 'AAA'], [57, 'DDD'], [28, 'CCC'],[18, 'BBB']]; a.sort((a, b) => a[1].localeCompare(b[1])); console.log(a)
источник
Если вы похожи на меня, вам не захочется менять каждый индекс каждый раз, когда вы хотите изменить столбец, по которому выполняется сортировка.
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);
источник
Ничего особенного, просто экономия затрат на возврат значения по определенному индексу из массива.
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"]]"
источник
a[colIndex]
снова и снова, но я улавливаю это здесьa = a[colIndex]
. Это более эффективно. 2. Я использую другой вкусif
, делая его короче. 3. Я не возвращаюсьarr
в результате выполненияsortByCol
функции, а это означает, что мою функцию нельзя использовать для создания другой ссылки. Надеюсь, это поможет!в одной строке:
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) }
источник
Если вы хотите отсортировать по первому столбцу (который содержит числовое значение), попробуйте следующее:
arr.sort(function(a,b){ return a[0]-b[0] })
Если вы хотите отсортировать по второму столбцу (который содержит строковое значение), попробуйте следующее:
arr.sort(function(a,b){ return a[1].charCodeAt(0)-b[1].charCodeAt(0) })
PS для второго случая вам нужно сравнить их значения ASCII.
Надеюсь это поможет.
источник
Поскольку мой вариант использования включает в себя десятки столбцов, я немного расширил ответ @jahroy. (также только что понял, что у @ charles-Clayton была такая же идея.)
Я передаю параметр, по которому хочу отсортировать, и функция сортировки переопределяется с желаемым индексом для сравнения.
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; } } }
источник
Стоя на плечах charles-Clayton и @ vikas-gautam, я добавил проверку строк, которая необходима, если в столбце есть строки, как в OP.
return isNaN(a-b) ? (a === b) ? 0 : (a < b) ? -1 : 1 : a-b ;
Тест
isNaN(a-b)
определяет, нельзя ли привести строки к числам. Если они могут, тогдаa-b
тест действителен.Обратите внимание, что сортировка столбца смешанных типов всегда дает интересный результат, поскольку проверка на строгое равенство
(a === b)
всегда возвращает false. См. MDN здесьЭто полный сценарий с тестом Logger - с использованием скрипта Google Apps.
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"], ]" */ }
источник