сортировать объекты по значениям свойств - PullRequest
0 голосов
/ 23 января 2012

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

    objectz.sort(function(a,b){
        return b.metric - a.metric;
    }

Проблема в том, что некоторые объекты имеют одинаковые значения свойств, и результаты сортировки всегда различны. Я хочу дополнительно отсортировать объекты с одинаковым значением метрики по их свойству name, чтобы я каждый раз получал один и тот же порядок объектов Я сортирую их.

Спасибо заранее!

Ответы [ 2 ]

2 голосов
/ 23 января 2012
objectz.sort(function(a,b){
    var result = b.metric - a.metric;
    if (!result) return a.name > b.name ? 1 : -1;
    return result;
});
0 голосов
/ 23 января 2012

Аналогично zerkms:

objectz.sort(function(a,b) {
    var x = b.metric - a.metric; 
    return x || b.name - a.name;
});

Кажется, что это обратная сортировка (сначала появляются более высокие значения), это то, что вы хотите?

Редактировать

Обратите внимание, что оператор - подходит только в том случае, если значение name можно преобразовать в число. В противном случае используйте < или >. Функция сортировки должна иметь дело с a.name == b.name, чего сам по себе оператор > не будет делать, поэтому вам нужно что-то вроде:

objectz.sort(function(a,b) {
    var x = b.metric - a.metric; 

    // If b.metric == a.metric
    if (!x) {

      if (b.name == a.name) {
        x = 0;

      else if (b.name < a.name) {
        x = 1;

      else {
        x = -1;
      }
    }
    return x;
});

, который можно сделать более кратким:

objectz.sort(function(a,b) {
    var x = b.metric - a.metric; 

    if (!x) {
      x = (b.name == a.name)? 0 : (b.name < a.name)? 1 : -1;
    }
    return x;
});

Учитывая, что сравнение metric представляется наибольшим по наименьшему порядку, тогда троичное выражение должно быть:

      x = (b.name == a.name)? 0 : (b.name < a.name)? -1 : 1;

если требуется, скажем, Зельда приходит раньше Энн. Кроме того, значение name должно быть уменьшено до всего нижнего регистра (или всего верхнего регистра), в противном случае 'zelda' и 'Ann' будут отсортированы в обратном порядке к 'Zelda' и 'ann'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...