2013-02-13 3 views
3

У меня есть это очень простой метод сортировки:Настройка функции сортировки массивов JavaScript

sortByNumericAttr : function (a, b,attr){    
     a = a[attr]; 
     b = b[attr]; 
     return ((a < b) ? -1 : ((a > b) ? 1 : 0)); 
} 

Идея заключается в том, что у меня есть разные объекты с различными ATTR, который нуждается в сортировочный (идентификатор, тип и т.д.), так что я вместо того, чтобы писать разные функции сортировки для каждого (где вся разница - это только отсортированный атрибут), я бы написал общий метод и передал ему атрибут.

Так что, если написано, как это я могу назвать это нравится:

arr.sort(utils.sortByNumericAttr,'typeId'); 

Как я могу добиться этого или подобного эффекта, основанного на этой функции?

+0

Этот код выглядит нормально ..... –

+0

Да, не работает, сортировка только для javascript принимает функцию, attr не определено – Tomer

+0

Так же, как вопрос «это возможно» в стороне, как правило, не является полезным дополнением к телу знаний SO. На самом деле нет никаких вопросов «да/нет». На большинство из них можно даже ответить, быстро консультируясь с соответствующей документацией (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/sort) (где вы можете увидеть правильную подпись методов и т. д.). Правильная помощь в реализации функции - это совсем другое дело. – nbrooks

ответ

8

Вы можете создать функцию с помощью другой функции:

function sort_by(attr) { 
    return function(o1, o2) { 
     var a = o1[attr]; 
     var b = o2[attr]; 

     return ((a < b) ? -1 : ((a > b) ? 1 : 0)); 
    }; 
} 

А потом называют это как .sort(sort_by('id')).

+0

+1 Гений! работает как шарм :) – Tomer

0

Если у вас есть список, как это:

var list = [ 
    {id:5, color:"Green", name:"Audi"}, 
    {id:1, color:"Red", name:"Ferrari"}, 
    {id:3, color:"Silver", name:"Mercedes"} 
]; 

Вы можете создать функции сортировки для сортировки этот список для каждого из используемых ключей:

function sortById(a,b) { return (a.id-b.id); } 
list.sort(sortById); 

function sortByName(a,b) { return (a.name.localeCompare(b.name)); } 
list.sort(sortByName); 

function sortByColor(a,b) { return (a.color.localeCompare(b.color)); } 
list.sort(sortByColor); 
+0

Черт, я замедляюсь ^^ – Nippey

+0

Идея, как я заметил в моем вопросе, заключалась в том, чтобы написать одну общую функцию, а не отдельную функцию для каждого атрибута. – Tomer

+0

А, правильно, я вижу, что вы имею в виду. И, конечно, +1 Блендеру;) – Nippey

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