簡體   English   中英

當數組的某些部分沒有數據時,javascript自定義排序

[英]javascript custom sort when parts of an array has no data

我有一個如下所示的對象模型:

MyObject = {
   TheName: "",
   OtherProps :....
}

我有一個這些對象的數組,我的自定義排序函數如下所示:

function SortArray() {

  var CustomFunction;

  var CustomSortAsc = function (a, b) {
    return a['TheName'] - b['TheName'];
  }

  var CustomSortDsc = function (a, b) {
    return b['TheName'] - a['TheName'];
  }

  if (SomeCondition) {
      CustomFunction = CustomSortAsc;
  } else {
      CustomFunction = CustomSortDsc;
  }

  SomeArray.sort(CustomFunction);
}

SomeArray有大約200-300個對象,問題是有時對象有一個空的TheName屬性。 因此,排序似乎沒有按預期工作。 例如,如果有值,則按名稱排序,然后根據sort函數放入沒有名稱的所有值。

這項工作的方法是什么? 謝謝你的建議。

由於您的TheNames是字符串,您最好使用localeCompare

var CustomSortAsc = function(a, b) {
    return (a['TheName'] || '').localeCompare(b['TheName'] || '');
};

我可能會這樣寫:

var baseSort = function(a, b) { 
  return (a['TheName'] || '').localeCompare(b['TheName'] || '');
};
var CustomFunction = SomeCondition 
                   ? baseSort 
                   : function(a, b) { return -baseSort(a, b); };

更新:如果你需要一直看到空值...

var CustomSortAsc = function(a, b) {
    return a['TheName'] === '' 
         ? b['TheName'] === ''
           ? 0
           : 1
         : b['TheName'] === ''
           ? -1
           : a['TheName'].localeCompare(b['TheName']); 
};

...或者,如果您願意, if

if (a['TheName'] === '') {
  if (b['TheName'] === '') {
    return 0;
  } else {
    return 1;
  }
} else {
  if (b['TheName'] === '') {
    return -1;
  } else {
    return a['TheName'].localeCompare(b['TheName']);
  }
}

(這實際上更具可讀性嗎?)

自定義排序函數必須返回一個數字(<,=或> 0)。 如果它返回任何其他內容(如NaN ),則行為是“特定於實現”(根據標准),這意味着它通常會中斷並且不會對任何內容進行排序。

我不確定你要排序的是什么('TheName'聽起來像字符串,你的函數是數字),但是如果b上不存在屬性你應該返回1,如果是a則你應該返回-1; 然后,您的無屬性項將被排序到數組的末尾。

暫無
暫無

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

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