我无法弄清楚为什么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我是编码的新手,所以欢迎任何其他提示/回复)
答案 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)
,它会测试undefined
和null
。
但是,由于示例中的iterator
是身份函数,因此此错误无关紧要,newArr
看起来与预期一致。
return a[1] - b[1];
如果其中一个值为undefined
,则减法的结果将为NaN
- 这不是比较函数的有效返回值。如果发生这种情况,sort
行为是未指定的 - 它可能是(依赖于实现的)任何东西,因为搞砸了订单,根本没有排序,甚至从未终止。另请参阅this answer和the relevant spec section。
因此,选择要在结果数组中放置undefined
值的位置,并为元组(数组)中的所需位置添加可比较的值。可能是Infinity
或-Infinity
?