Javascript 给定未定义时JS排序不排序

Javascript 给定未定义时JS排序不排序,javascript,sorting,Javascript,Sorting,我不明白为什么sort函数不对包含未定义的数组进行排序 var sortBy = function(collection, iterator) { var newArr = map(collection, function(item, key, collection) { if (item === undefined, null) { return [undefined, undefined]; } else {

我不明白为什么sort函数不对包含未定义的数组进行排序

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; });
如果删除未定义的数组,数组的排序就很好。有了它,它根本就不会排序。 谢谢你的帮助!(顺便说一句,我对编码还不熟悉,所以欢迎您提供有关这方面的任何其他提示/建议)

假设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];
    }
或者您希望使用无穷大对未定义和null进行排序的任何值

永远不会实现-它正在使用。您需要
if(item==null)
,它将测试
未定义的
null

但是,由于示例中的
迭代器是identity函数,因此此错误无关紧要,而且
newArr
看起来与预期一样


如果其中一个值是
未定义的
,则减法结果将是
NaN
——这不是比较函数的有效返回值。如果发生这种情况,
排序
行为是未指定的-它可能(依赖于实现)任何事情,包括打乱顺序、根本不排序,甚至永远不会终止。另见和


因此,选择要在结果数组中放置
未定义的
值的位置,并在元组(数组)中的所需位置放置一个可比较的值。也许
Infinity
或者
-Infinity

也许
if(item==undefined,null){
应该是
if(item==undefined | | item==null){
。if(item==null)一下子涵盖了null和undefined。仔细考虑之后,也许
[null,Math.MAX\u VALUE]
[undefined,无穷]
因此它们按排序。:-)谢谢!映射是用下划线表示的u.map,但在这个项目中是用JS编写的。对于var re,这意味着什么?
if (item === undefined, null)
return a[1] - b[1];