Сортировка многомерного массива в 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);