数组部分没有数据时的javascript自定义排序
我有一个如下所示的对象模型:数组部分没有数据时的javascript自定义排序,javascript,Javascript,我有一个如下所示的对象模型: MyObject = { TheName: "", OtherProps :.... } function SortArray() { var CustomFunction; var CustomSortAsc = function (a, b) { return a['TheName'] - b['TheName']; } var CustomSortDsc = function (a, b) { return
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);
}
var baseSort = function(a, b) {
return (a['TheName'] || '').localeCompare(b['TheName'] || '');
};
var CustomFunction = SomeCondition
? baseSort
: function(a, b) { return -baseSort(a, b); };
我有一个这些对象的数组,我的自定义排序函数如下所示:
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);
}
var baseSort = function(a, b) {
return (a['TheName'] || '').localeCompare(b['TheName'] || '');
};
var CustomFunction = SomeCondition
? baseSort
: function(a, b) { return -baseSort(a, b); };
SomeArray
中大约有200-300个对象,问题是有时该对象有一个空的TheName
属性。正因为如此,这种方法似乎并不像预期的那样有效。例如,如果有值,则按名称排序,然后根据排序函数放置所有没有名称的值
怎样才能让这一切顺利进行?谢谢您的建议。因为您的TheNames是字符串,您最好使用: 我可能会这样写:
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);
}
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 (a['TheName'] === '') {
if (b['TheName'] === '') {
return 0;
} else {
return 1;
}
} else {
if (b['TheName'] === '') {
return -1;
} else {
return a['TheName'].localeCompare(b['TheName']);
}
}
(这真的更可读吗?因为您的TheNames是字符串,所以您最好使用:
我可能会这样写:
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);
}
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 (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
),则该行为是“特定于实现的”(根据标准),这意味着它通常会中断,而只是不排序
我不确定您试图排序的是什么(“name”听起来像字符串,您的函数是数字),但如果b上不存在属性,您应该只返回1,如果a上不存在属性,则返回-1;然后,无属性项将被排序到数组的末尾。自定义排序函数必须返回一个数字(0)。如果它返回任何其他内容(如NaN
),则该行为是“特定于实现的”(根据标准),这意味着它通常会中断,而只是不排序
我不确定您试图排序的是什么(“name”听起来像字符串,您的函数是数字),但如果b上不存在属性,您应该只返回1,如果a上不存在属性,则返回-1;然后,您的无属性项将被排序到数组的末尾。类似于return(a['TheName']|0)-(b['TheName']|0)代码>工作(因为您使用的是-
,我假设值是数字)?您使用a-b
进行排序,这将导致大多数字符串的NaN
。如果两者都是空字符串,您将得到一个合法值0
@Rocket:不,它们是字符串。@frenchie:如果它们是字符串,则您不能使用-
来比较它们。是否返回(a['TheName']| 0)-(b['TheName']| 0)代码>工作(因为您使用的是-
,我假设值是数字)?您使用a-b
进行排序,这将导致大多数字符串的NaN
。如果两者都是空字符串,您将得到一个合法值0
@Rocket:不,它们是字符串。@frenchie:如果它们是字符串,那么您就不能使用-
来比较它们。我得到一个错误对象MrJones没有localCompare方法。@frenchie:有一个e:@raina77ow:不幸的是,这是一个在我的机器上运行的单页应用程序;无法提供一个实际示例。好的,当我按降序排序(名称先按z排序,然后按a排序,然后按空格排序)时,本地比较会起作用,但问题是,当我按升序排序时,我首先看到的是所有空格,然后再按a到z排序;它们只是空字符串。我想是吧?条件语法使代码很难阅读,特别是当存在嵌套条件时。我得到一个错误对象MrJones没有localCompare方法。@frenchie:有一个e:@raina77ow:不幸的是,这是一个在我的机器上运行的单页应用程序;无法提供一个实际示例。好的,当我按降序排序(名称先按z排序,然后按a排序,然后按空格排序)时,本地比较会起作用,但问题是,当我按升序排序时,我首先看到的是所有空格,然后再按a到z排序;它们只是空字符串。我想是吧?条件语法使代码难以阅读,尤其是当存在嵌套条件时。