Сортировка многомерного массива в JavaScript

Как отсортировать многомерный массив в JavaScript?

У меня есть массив, полный массивов, содержащих две даты и строку. Мне нужен основной массив, отсортированный по одному из массивов дат, возможно ли это?

сведения структура:

events = [
 { date 1, date 2, string },
 { date 2, date 2, string },
 ]

3 ответов


дубликат сортировка внешнего массива на основе значений во внутреннем массиве, javascript здесь вы найдете несколько ответов, как мой собственный

var arr = [.....]
arr.sort((function(index){
    return function(a, b){
        return (a[index] === b[index] ? 0 : (a[index] < b[index] ? -1 : 1));
    };
})(2)); // 2 is the index

это сортируется по индексу 2


структура массива, кажется, немного расплывчато из вашего описания. Для сравнения элементов и выполнения сортировки можно использовать пользовательскую функцию сортировки.

предполагая структуру:

var data = [
    [date11, date12, string],
    [date21, date22, string],
    [date31, date32, string],
    ...
];

если бы у вас были объекты вместо вложенных массивов, вам не нужно было бы использовать числовые индексы. Вот!--2--> и b[0] используются для сравнения первого элемента в двух вложенных массивах (при условии его даты, которую вы хотите отсортировать). Кроме того, предполагая, что A[0] и b[0] уже являются объектами Date-you может потребоваться создать объекты Date, если они еще не созданы.

обновление: спасибо @maerics за указание на это. Возвращаемое значение компаратора должно быть [отрицательным, 0, положительным], соответствующим значениям [a b].

function sortByDate(a, b) {
    return a[0].getTime() - b[0].getTime();
}

data.sort(sortByDate);

этот пример предназначен для сортировки массивов по номерам (и датам) или строкам.

Array.prototype.deepsort= function(){
    var i, order= arguments, L= order.length, tem;
    return this.sort(function(a, b){
        i= 0;
        while(i < L){
            tem= order[i++];
            var ao= a[tem] || 0, bo= b[tem] || 0;
            if(ao== bo) continue;
            return ao> bo? 1: -1;
        }
        return 0;
    });
}

var a= [ [ 'z', 1, 0 ], [ 'a', 0, 1 ],['m',-1,10] ,['a','1',-1]];

alert(a.deepsort(0,1,2)+'\n\n'+a.deepsort(2,0,1)) 

сортировка по выбранному индексу (в качестве аргумента).

Если элементы этого индекса в каждом массиве совпадают, сортировка по следующему индексу передается в качестве аргумента, если таковой имеется.

продолжить, пока элементы совпадают и есть больше аргументов.

вам не нужно указывать более одного индекса для сортировки по

a.deepsort(0);
a.deepsort(2);