Подтвердить что ты не робот

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

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

var myArray = [
                [1, 'alfred', '...'],
                [23, 'berta', '...'],
                [2, 'zimmermann', '...'],
                [4, 'albert', '...'],
              ];

Как я могу отсортировать его по имени, чтобы альберт пришел первым, а циммерман последним?

Я знаю, как бы это сделать, если бы я мог использовать целое число для сортировки, но строка оставляет меня невежественной.

Спасибо за вашу помощь!:)

4b9b3361

Ответ 1

Это может быть достигнуто путем передачи поддерживающей функции в качестве аргумента вызова метода Array.sort.

Что-то вроде этого:

 function Comparator(a, b) {
   if (a[1] < b[1]) return -1;
   if (a[1] > b[1]) return 1;
   return 0;
 }

 var myArray = [
   [1, 'alfred', '...'],
   [23, 'berta', '...'],
   [2, 'zimmermann', '...'],
   [4, 'albert', '...'],
 ];

 myArray = myArray.sort(Comparator);
 console.log(myArray);

Ответ 2

Вы все еще можете использовать array.sort() с пользовательской функцией. Внутри функции просто сравните элемент, который вы хотите использовать в качестве ключа. Например, вы можете использовать:

myArray.sort(function(a, b) { 
    return a[1] > b[1] ? 1 : -1;
});

Ответ 4

Awesome! Составная сортировка по первому элементу, второму элементу, а затем третьему, все восходящие в этом примере будут

myArray=myArray.sort(function(a,b){
    retVal=0;
    if(a[0]!=b[0]) retVal=a[0]>b[0]?1:-1;
    else if(a[1]!=b[1]) retVal=a[1]>b[1]?1:-1;
    else if(a[2]!=b[2]) retVal=a[2]>b[2]?1:-1;
    return retVal
});

(несколько сортировок по нескольким столбцам)

Ответ 5

В ES6 можно сделать относительно простую:

myArray.sort(([a], [b]) => a.localeCompare(b))

или

myArray.sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0)

Полезные/современные биты являются оператором лямбда => и деструктурированием аргумента [X].