2012-05-01 2 views
5

У меня есть массив MyArrayOfItems из Item объектов с объектами, которые выглядят следующим образом:Javascript сортировать массив в два раза сортировать

Item 
{ 
    ContainerID: i, // int 
    ContainerName: 'SomeName', // string 
    ItemID: j, // int 
    ItemName: 'SomeOtherName' // string 
} 

Я хочу, чтобы отсортировать этот массив таким образом, чтобы он отсортирован по ContainerID, а затем ItemName в алфавитном порядке.

У меня есть пользовательская функция сортировки, которая до сих пор выглядит следующим образом:

function CustomSort(a, b) { 

    Item1 = a['ContainerID']; 
    Item2 = b['ContainerID']; 

    return Item1 - Item2; 
} 

MyArrayOfItems.sort(CustomSort); 

Эта сортировка по ContainerID, но как же я тогда сортировать по ITEMNAME?

Спасибо.

+0

возможно дубликат [Javascript массива сортировки двумя полями] (http://stackoverflow.com/questions/6129952/javascript-sort-array-by-two-fields) –

+0

@FelixKling: на самом деле не; Мне нужно его сортировать по алфавиту. – frenchie

+0

Итак? Вы можете легко сравнить stings с '<' and '>', хотя я согласен, что 'localCompare' - лучший способ. Я думал, что общий вопрос заключается в том, как сортировать по двум свойствам, и в этом случае это явно дубликат. –

ответ

6

Использование String.localeCompare функция. И используйте его, когда ContainerID из a и b равны.

function CustomSort(a, b) { 
    var Item1 = a['ContainerID']; 
    var Item2 = b['ContainerID']; 
    if(Item1 != Item2){ 
     return (Item1 - Item2); 
    } 
    else{ 
     return (a.ItemName.localeCompare(b.ItemName)); 
    } 
} 

Чтобы настроить порядок сортировки всегда можно поставить - перед любым return выражения.

+0

Работает ли localCompare в IE8? – frenchie

+0

Он должен. Как и в JavaScript 1.2, который очень старый. –

+0

localcompare - хороший выбор, но, как я помню, у хроме были проблемы с ним. Http: //code.google.com/p/v8/issues/detail? Id = 459 –

4
function CustomSort(a, b) { 

    Item1 = a['ContainerID']; 
    Item2 = b['ContainerID']; 
    if(Item1 - Item2 !=0){ 
     return Item1 - Item2; 
    } 
    else{ 
     if (a.ItemName < b.ItemName) 
     return -1; 
     if (a.ItemName > b.ItemName) 
     return 1; 
     return 0; 
    } 
} 
+0

ОК, спасибо; а также работает. Я предпочитаю localeCompare. – frenchie

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