1

我有一个看起来像这样的对象模型:

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属性。因此,排序似乎没有按预期工作。例如,如果有值,则按名称排序,然后根据排序函数将所有没有名称的值放入。

使这项工作的方法是什么?感谢您的建议。

4

2 回答 2

4

由于您的 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']);
  }
}

(这实际上更具可读性吗?)

于 2012-07-09T16:43:52.253 回答
0

自定义排序函数必须返回一个数字(<、= 或 > 0)。如果它返回任何其他内容(如NaN),则行为是“特定于实现的”(根据标准),这意味着它通常会中断并且什么都不排序。

我不确定您要对什么进行排序('TheName' 听起来像字符串,您的函数用于数字),但是如果 b 上不存在该属性,则应该返回 1,如果 a 上不存在则返回 -1;那么您的无属性项目将被排序到数组的末尾。

于 2012-07-09T16:50:02.493 回答