Tairesh
@Tairesh
Веб-программист

Заковыристая сортировка многомерного массива?

Есть массив вида:
var options = [];
options[1]=['...4','...',4];
options[2]=['...3','...',3];
options[3]=['...5','...',5];
options[5]=['...1','...',1];
options[6]=['...99','...',99];


Необходимо вывести эти троеточия в порядке 1,3,4,5,99. Проблема в том что id-шки (1,2,3,5,6) — нужно сохранить, а обычная сортировка
function sOrder(a, b) {
if (a[2] > b[2]) return 1;
else if (a[2] < b[2]) return -1;
else return 0;
}
options.sort(sOrder);


их убивает. И да, id идут не по порядку.
  • Вопрос задан
  • 6696 просмотров
Решения вопроса 1
Methos
@Methos
Сортировка в любом случае будет индексы менять. Поэтому вам не нужно хранить эти id в индексах, а хранить их нужно в самом объекте.

var options = []; options.push({data:['...4','...',4], id : 3}; // и т.д.

Сортировать так:

function sOrder(a, b) { if (a.data[2] > b.data[2]) return 1; else if (a.data[2] < b.data[2]) return -1; else return 0; } options.sort(sOrder);
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Keenest
@Keenest
Мне кажется проще сделать всё через объекты. А именно — сначала распарсить многомерный массив в массив объектов, ну а отсортировать массив объектов по нужному полю не проблема:

var arr = [];
options.forEach(function (key) {
    var o = {
        first: key[0],
        second: key[1],
        third: key[2]
    };
    arr.push(o);
});

var asc = function (field) { // функция для сортировки в прямом порядке (по возрастанию)
 return function (x, y) {
   return x[field] > y[field];
 }
};

arr.sort(asc('first'));
Ответ написан
Комментировать
@jorikburlakov
Честно говоря, вообще не понятен вопрос.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы