【问题标题】:Passing additional parameters in the compareFunction of .sort() method在 .sort() 方法的 compareFunction 中传递附加参数
【发布时间】:2013-10-29 13:11:04
【问题描述】:

方法

我正在尝试创建一个自定义方法,该方法将使用我选择的参数对数组对象进行排序。

例如,我有以下数组...

var albumList = [
   { value: 'A 2011', count: '18' },
   { value: 'Z 2012', count: '22' },
   { value: 'C 2012', count: '7' },
   { value: 'H 2013', count: '21' }
   // etc...
];

我设法按“值”按字母顺序对这个数组进行排序,但功能有限。

Array.prototype.alphaSort = function () {
    function compare(a, b) {
        if (a.value < b.value) // sorting by 'count'
            return -1;
        if (a.value > b.value) // sorting by 'count'
            return 1;
        return 0;
    }
    this.sort(compare);
}

然后通过调用albumList.alphaSort(); 一切正常。然而,我之所以称它为受限,是因为我无法确定对数组进行排序所依据的参数。默认情况下它是 'value',因为它已在上面的第二个代码 sn-p 中设置。

基本上,我想做的是拥有类似albumList.alphaSort('count') 的东西,这将允许该函数根据'count'或我将来可能拥有的任何东西自动执行排序过程额外的键和值,而不是来回更改整个代码...

// .alphaSort('count') should be interpreted as follows

if (a.count < b.count) // sorting by 'value'
     return -1;
if (a.count > b.count) // sorting by 'value'
     return 1;

换句话说,我需要传递一个我可以随时实现的参数/参数;因此,我可以轻松处理因以后的更改而产生的任何错误。这样一来,比较逻辑就是……

a.MY_ARGUMENT &lt; b.MY_ARGUMENT

我希望你明白我在寻找什么!


问题

作为一种尝试,为了清楚起见(尽管它没有任何意义),我做了如下......

Array.prototype.alphaSort = function (sortParameter) {
     function compare(a, b) {
         if (a.sortParameter < b.sortParameter) 
             return -1;
         if (a.sortParameter > b.sortParameter)
             return 1;
         return 0;
    }
    this.sort(compare);
}

albumList.alphaSort('count');

显然,这不会将 'sortParameter' 传递给 compare 函数,而且,compare(a,b) 不会接受任何其他参数。


可能重复

Any way to extend javascript's array.sort() method to accept another parameter?

【问题讨论】:

  • 恰如其分的“问题”,虽然 sortParameter 没有传递给 compare 函数,但是由于“closure”,compare 函数可以访问 sortParameter。您只需要将 a.sortParameter 更改为 a[sortParameter]。

标签: javascript arrays sorting parameter-passing


【解决方案1】:

这对我有用:

    Array.prototype.alphaSort = function (sortParameter) {
        function compare(a, b) {
            function isNumeric(num){
                return !isNaN(num)
            }

            // convert string to numbers if necessary:
            // http://stackoverflow.com/questions/175739/is-there-a-built-in-way-in-javascript-to-check-if-a-string-is-a-valid-number
            var left = (isNumeric(a[sortParameter])) ? +a[sortParameter] : a[sortParameter];
            var right = (isNumeric(b[sortParameter])) ? +b[sortParameter] : b[sortParameter];

            if (left < right)
                return -1;
            if (left > right) 
                return 1;
            return 0;
        }
        this.sort(compare);
    }

    var albumList = [
       { value: 'A 2011', count: '18' },
       { value: 'Z 2012', count: '22' },
       { value: 'C 2012', count: '7' },
       { value: 'H 2013', count: '21' }

    ];

    albumList.alphaSort('count');
    console.log(albumList);

在 Javascript 中,您可以使用 obj.value 和 obj[value] 来获取对象值。

【讨论】:

  • 嗯,这显然对我有用!我仍然不明白的是我们将a.sortParameter 更改为a[sortParameter] 的原因。这有什么合乎逻辑的理由吗?有没有关于这个问题的文档?
  • 我相信通过调用a.sortParameter,sortParameter被认为是对象的实际键而不是传递的参数。我说的对吗?
  • 如果你使用 a.xxx 那么 xxx 被静态解释。所以,你上面的第二条评论是正确的。此外,我还修改了代码以在比较之前将字符串转换为数字(如果适用)。例如。 "7" > "20" 但 7
猜你喜欢
  • 2013-07-07
  • 1970-01-01
  • 2022-08-02
  • 2012-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-19
相关资源
最近更新 更多