2015-04-28 2 views
4

Я пытаюсь сортировать массив с массивом строк в нем. Это похоже на эту проблему (Sort an array with arrays in it by string), но я не был уверен, как это реализовать. Мой массив следующим образомСортировка массива массивов со строками в нем

var myArray = [ 
      ['blala', 'alfred', '...'], 
      ['jfkdj', 'berta', '...'], 
      ['vkvkv', 'zimmermann', '...'], 
      ['cdefe', 'albert', '...'], 
      ]; 

Я пытаюсь отсортировать его в алфавитном порядке (не чувствительно к регистру) по имени или второго аргумента для внутренних массивов. После этого я хочу сортировать по первому аргументу, если есть два элемента с тем же вторым аргументом. Я попытался использовать следующее, но не увенчался успехом и не понял почему. Может ли кто-нибудь посоветовать:

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

var myArray = [ 
      ['blala', 'alfred', '...'], 
      ['jfkdj', 'berta', '...'], 
      ['vkvkv', 'zimmermann', '...'], 
      ['cdefe', 'albert', '...'], 
       ]; 

myArray = myArray.sort(Comparator); 

Чтобы отсортировать первый аргумент после второго аргумента, я сделаю это?

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

    var myArray = [ 
       ['blala', 'alfred', '...'], 
       ['jfkdj', 'berta', '...'], 
       ['vkvkv', 'zimmermann', '...'], 
       ['cdefe', 'albert', '...'], 
        ]; 

    myArray = myArray.sort(Comparator); 
+0

У вас есть дополнительный ')' - попробуйте 'если (а [1] <б [1]) вернет -1,' ' –

+0

, если (а [1] undefined

+0

@ Vohuman довольно уверен, что он хочет, чтобы кто-то объяснил код, а не почему его опечатка неверна. – Blob

ответ

3

Вы могли бы код:

function Comparator(a, b) { 
    // you can use the `String.prototype.toLowerCase()` method 
    // if the comparison should be case insensitive 
    if (a[1] < b[1]) return -1; 
    if (a[1] > b[1]) return 1; 
    if (a[0] < b[0]) return -1; 
    if (a[0] > b[0]) return 1; 
    return 0; 
} 

выше функция сначала сортирует элементы на основе второго элемента массивов. Если второй элемент равен, то он сортирует их на основе первых элементов, и если a[1] === b[1] и a[0] === b[0] он возвращает 0, который оставляет позиции a и b без изменений.

From MDN Array.prototype.sort documentation:

Если compareFunction поставляется, элементы массива сортируются в соответствии со значением возврата функции сравнения. Если a и b два элемента сравнивает, то:

  • Если compareFunction(a, b) меньше 0, своего рода a к более низкому индексу, чем b, т.е. a приходит первым.
  • Если compareFunction(a, b) возвращает 0, оставьте a и b без изменений по отношению друг к другу, но отсортированы по всем различным элементам. Примечание. Стандарт ECMAscript не гарантирует такого поведения, и, таким образом, не все браузеры (например, версии Mozilla, датированные как минимум 2003 годом).
  • Если compareFunction(a, b) больше 0, сортировать b по нижнему индексу, чем a. compareFunction(a, b) должен всегда возвращать одно и то же значение при задании определенной пары элементов a и b в качестве двух аргументов. Если возвращаются несогласованные результаты, порядок сортировки не определен.
+0

Прямо сейчас - я подключаю это и работает, но я до сих пор не понимаю, как это работает – djfkdjfkd39939

+1

Привет, вы можете найти здесь больше объяснений о том, как работает функция сортировки http: //www.w3schools. com/jsref/jsref_sort.asp. – vasilenicusor

+0

Он работает, сначала сравнивая имена - то есть [1] и b [2] - и если один больше другого, то в алфавитном порядке он возвращает 1 или -1, в зависимости от того, какой из них больше. Если ни один из них больше, это означает, что они равны, поэтому он продолжается и пытается сравнить [0] и b [0] таким же образом. –

Смежные вопросы