在JS

2011-08-25 49 views
0

排序陣列我有一個對象:在JS

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對它進行排序。 Ascdesc。要做到這一點,我使用這個功能:

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將是正確的。

可以修復嗎?

回答

1

接受函數作爲參數的數組沒有反轉函數。
你應該嘗試:

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

你錯了。 'dynamicSort(property)'被調用一次,其結果(排序函數)然後作爲參數傳遞給'Array.sort()'。並且每個比較都會調用該函數(只有那個函數)(順便說一句,有'n * log(n)'比較排序)。所以你的優化沒有任何影響。 –

+0

你說得對,我想現在還爲時過早,我想清楚:)我會從我的帖子中刪除這個。 – revers

0

也許你會使用jLinq? 在JLINQ分揀外觀:

var result = jlinq.from(Data).sort("-votes").select(); 
console.log(result); 
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]; 
    } 
} 

這也應該稍微更有效。當然,如果你有時按字符串值排序,你仍然需要舊函數。