2013-01-24 71 views
9

我有我需要排序的自定義函數對象的數組,因爲我想這樣做幾次在幾個對象的屬性,我想爲屬性dinamically傳遞鍵名到自定義排序功能:JS排序()自定義函數我怎樣才能更多參數傳遞?

function compareOnOneFixedKey(a, b) { 
    a = parseInt(a.oneFixedKey) 
    b = parseInt(b.oneFixedKey) 
    if (a < b) return -1 
    if (a > b) return 1 
     return 0 
} 

arrayOfObjects.sort(compareByThisKey) 

應該成爲這樣的:

function compareOnKey(key, a, b) { 
    a = parseInt(a[key]) 
    b = parseInt(b[key]) 
    if (a < b) return -1 
    if (a > b) return 1 
     return 0 
} 
arrayOfObjects.sort(compareOn('myKey')) 

可以這樣方便的方式來完成?謝謝。

回答

9

您將需要partially apply功能,如使用bind

arrayOfObjects.sort(compareOn.bind(null, 'myKey')); 

,或者你只是讓compareOn返回實際的排序功能,與外部函數的參數(如由他人證明)參數化。

+0

+1的方法,我完全沒有考慮到。 –

+0

除了這個方法還不錯,它仍然存在兼容性問題。 – VisioN

+1

@VisioN:......但是讓這麼多的東西更容易:-)對於任何人考慮支持舊的IE,鏈接MDN頁面包含一個墊片 – Bergi

9

您可以添加一個包裝:

function compareOnKey(key) { 
    return function(a, b) { 
     a = parseInt(a[key], 10); 
     b = parseInt(b[key], 10); 
     if (a < b) return -1; 
     if (a > b) return 1; 
     return 0; 
    }; 
} 

arrayOfObjects.sort(compareOnKey("myKey")); 
4

是的,有比較從發電機,這需要PARAM這是關鍵返回你想

function compareByProperty(key) { 
    return function (a, b) { 
     a = parseInt(a[key], 10); 
     b = parseInt(b[key], 10); 
     if (a < b) return -1; 
     if (a > b) return 1; 
     return 0; 
    }; 
} 
arrayOfObjects.sort(compareByProperty('myKey')); 

compareByProperty('myKey')回到做功能相比較,然後將其傳遞到.sort

+0

運作良好,但choosen其靈活性.bind()方法。感謝您對parseInt函數重構我的代碼與底座10 :) –

相關問題