[英]JS sort not sorting when given 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; });
如果我刪除未定義,數組排序就好了。 有了它,它根本無法分類。 謝謝你的幫助! (PS我是編碼的新手,因此歡迎其他提示/記錄)
假設地圖功能類似於:
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以using- 無限可能進行排序?
if (item === undefined, null)
永遠不會實現-它使用逗號運算符 。 您需要if (item == null)
,它將同時測試undefined
和null
。
但是,由於示例中的iterator
是身份函數,因此此錯誤無關緊要,並且newArr
看起來像預期的那樣。
return a[1] - b[1];
如果其中一個值undefined
,則減法的結果將為NaN
這不是比較函數的有效返回值。 如果發生這種情況,則sort
行為是不確定的-可能是(依賴於實現的)任何事情,包括搞亂訂單,根本不排序甚至永不終止。 另請參見此 答案和相關規范部分 。
因此,選擇要在結果數組中放置undefined
值的位置,並為元組(數組)中的所需位置放置一個可比較的值。 也許是Infinity
或-Infinity
?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.