给定undefined时JS排序不排序

时间:2014-01-22 02:46:45

标签: javascript sorting

我无法弄清楚为什么sort函数不对包含undefined的数组进行排序。

var sortBy = function(collection, iterator) {
    var newArr = map(collection, function(item, key, collection) {

        if (item === undefined, null) {
            return [undefined, undefined];

        } else {
            if (typeof(iterator) === 'string') {
                return [item, item[iterator]];

            } else {
                var results = iterator(item);
                return [item, results];
            }
        }
    });

    newArr.sort(function(a, b) { 
        return a[1] - b[1];
    });

    return map(newArr, function(item, key, collection) {
        return  item[0];
    });
};

var list = [4, 1, undefined, 3, 2];
sortBy(list, function(i) { return i; });

如果我删除undefined,数组排序就好了。有了它,它根本不排序。 谢谢你的帮助! (PS我是编码的新手,所以欢迎任何其他提示/回复)

2 个答案:

答案 0 :(得分:2)

假设 map 函数类似于:

function map(obj, fn) {
  var re = /^\d+$/;
  var arr = [];

  for (var p in obj) {
    if (re.test(p) && obj.hasOwnProperty(p)) {
      arr.push(fn(obj[p], p, obj)); 
    }
  }
  return arr;
}

然后在sort函数中声明:

return a[1] - b[1];

将执行以下操作:

4 - undefined => NaN

因此迭代器中的错误行可能是:

    if (item === undefined || item === null) {
        return [undefined, 0];
    }

或者你想要的任何值 undefined null 使用 - Infinity 进行排序?

答案 1 :(得分:0)

if (item === undefined, null)

永远无法实现 - 它正在使用comma operator。您需要if (item == null),它会测试undefinednull

但是,由于示例中的iterator是身份函数,因此此错误无关紧要,newArr看起来与预期一致。


return a[1] - b[1];

如果其中一个值为undefined,则减法的结果将为NaN - 这不是比较函数的有效返回值。如果发生这种情况,sort行为是未指定的 - 它可能是(依赖于实现的)任何东西,因为搞砸了订单,根本没有排序,甚至从未终止。另请参阅this answerthe relevant spec section

因此,选择要在结果数组中放置undefined值的位置,并为元组(数组)中的所需位置添加可比较的值。可能是Infinity-Infinity