簡體   English   中英

給定未定義時,JS排序不排序

[英]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];
    }

或任何價值,你希望undefinednull以using- 無限可能進行排序?

 if (item === undefined, null) 

永遠不會實現-它使用逗號運算符 您需要if (item == null) ,它將同時測試undefinednull

但是,由於示例中的iterator是身份函數,因此此錯誤無關緊要,並且newArr看起來像預期的那樣。


 return a[1] - b[1]; 

如果其中一個值undefined ,則減法的結果將為NaN這不是比較函數的有效返回值。 如果發生這種情況,則sort行為是不確定的-可能是(依賴於實現的)任何事情,包括搞亂訂單,根本不排序甚至永不終止。 另請參見此 答案相關規范部分

因此,選擇要在結果數組中放置undefined值的位置,並為元組(數組)中的所需位置放置一個可比較的值。 也許是Infinity-Infinity

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM