我有一个对象:
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
将是正确的。
可以修复吗?
答案 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];
}
}
这也应该稍微有效一点。当然,如果您有时按字符串值排序,则仍需要旧函数。