Сортировка массива в js - PullRequest
       20

Сортировка массива в js

0 голосов
/ 25 августа 2011

У меня есть объект:

var Data = [{
    item_id:1,
    name:'John',
    date:1262293200000,
    votes:1
}, {
    item_id:2,
    name:'Nick',
    date:1313784000000,
    votes:2
},{ 
    item_id:3,
    name:'Paul',
    date:1299186000000,
    votes:-3
}]

Я хочу отсортировать его по item_id, name, date и votes. Asc и desc .Для этого я использую эту функцию:

function dynamicSort(property) { 
    return function (a,b) { 
        return (a[property] < b[property]) ? -1 : (a[property] > b[property]) ? 1 : 0; }}

Array.prototype.sortBy = function(property) { return this.sort(dynamicSort(property)) }
Array.prototype.reverseBy = function(property) { return this.reverse(dynamicSort(property)) }

Сортирует и меняет направление, но только после второго вызова.Например:

videoDataList.reverseBy("user_votes")

результат будет неправильным, но если я сделаю sortBy, а затем снова reverseBy, это будет правильной сортировкой.Также, если я позвоню reverseBy, а затем sortBy сортировка sortBy будет правильной.

Можно ли исправить?

Ответы [ 3 ]

1 голос
/ 25 августа 2011

Обратной функции для массива, принимающего функцию в качестве параметра, нет.
Вам следует попробовать:

 Array.prototype.reverseBy = function(property) {
    return this.sortBy(dynamicSort(property)).reverse()
 }
0 голосов
/ 25 августа 2011

Array.reverse() не принимает никаких параметров.Он не сортирует массив, просто меняет его текущий порядок.Таким образом, вы можете сначала отсортировать список (обратите внимание, что Array.reverse() и Array.sort изменяют массив на месте, не создавая новый массив):

Array.prototype.reverseBy = function(property)
{
  this.sortBy(property);
  this.reverse();
  return this;
};

Или вы используете функцию обратной сортировки:

function dynamicSortReverse(property)
{
  var innerFunc = dynamicSort(property);
  return function(a, b) { return -1 * innerFunc(a, b); };
}
Array.prototype.reverseBy = function(property) { return this.sort(dynamicSortReverse(property)); };

Второй подход является более эффективным.

Обратите внимание, что вы можете упростить функцию dynamicSort, если сортируете только по числовым свойствам:

function dynamicSort(property)
{ 
  return function (a, b)
  { 
    return a[property] - b[property];
  }
}

Это также должно быть немного более эффективным.Конечно, если вы иногда сортируете по строковым значениям, вам все равно понадобится старая функция.

0 голосов
/ 25 августа 2011

Может быть, вы будете использовать jLinq ?В jLinq сортировка выглядит:

var result = jlinq.from(Data).sort("-votes").select();
console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...