[英]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.