it-swarm.com.ru

Как отсортировать двухмерный массив по значению столбца?

Может ли кто-нибудь помочь мне отсортировать 2-мерный массив в JavaScript?

Он будет иметь данные в следующем формате:

[12, AAA]
[58, BBB]
[28, CCC]
[18, DDD]

Это должно выглядеть так, когда отсортировано:

[12, AAA]
[18, DDD]
[28, CCC]
[58, BBB]

Так что в основном сортировка по первому столбцу. 

Ура

51
Alex

Это так просто:

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;
    }
}
74
jahroy

Наилучшим подходом было бы использовать следующее, поскольку в первом столбце могут быть повторяющиеся значения. 

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]
});
38
Pramod Vemulapalli

попробуй это

//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];
});

Примечание. В исходном ответе вместо минус (-) использовалось больше, чем (>), что в комментариях называется неверным.

30
PSR

Если вы похожи на меня, вам не нужно будет менять каждый индекс каждый раз, когда вы хотите изменить столбец, по которому вы сортируете. 

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);
8
Charles Clayton

Использование функции стрелки и сортировка по второму строковому полю

var a = [[12, 'CCC'], [58, 'AAA'], [57, 'DDD'], [28, 'CCC'],[18, 'BBB']];
a.sort((a, b) => a[1].localeCompare(b[1]));
console.log(a)

5
Dinesh Rajan

Ничего особенного, просто сохранение затрат, необходимых для возврата значения по определенному индексу из массива.

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"]]"
3
Vikas Gautam

Поскольку в моем сценарии использования используются десятки столбцов, я немного расширил ответ @ 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;
    }
  }
}
0
olamotte