在js中排序数组

时间:2011-08-25 08:06:15

标签: javascript arrays sorting

我有一个对象:

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_idnamedatevotes对其进行排序。 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 个答案:

答案 0 :(得分:1)

对于接受函数作为参数的数组,没有反向函数 你应该试试:

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

答案 1 :(得分:0)

也许你会使用jLinq? 在jLinq排序中:

var result = jlinq.from(Data).sort("-votes").select();
console.log(result);

答案 2 :(得分:0)

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];
  }
}

这也应该稍微有效一点。当然,如果您有时按字符串值排序,则仍需要旧函数。