Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/460.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
数组部分没有数据时的javascript自定义排序_Javascript - Fatal编程技术网

数组部分没有数据时的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排序;它们只是空字符串。我想是吧?条件语法使代码难以阅读,尤其是当存在嵌套条件时。