2013-01-24 35 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 :) –

相关问题