Google Chrome中阵列上的未知/不一致排序行为

时间:2016-03-04 10:25:12

标签: javascript jquery google-chrome sorting

在Google Chrome中排序数组时,我无法理解下面提到的行为。这似乎是不一致的。我在Internet Explorer和Mozilla Firefox中尝试过相同的操作,看起来工作正常。任何人都可以帮助我理解和解决问题。

编辑: 要求是根据标准对对象列表进行排序。此对象列表绑定到UI上的列表视图。对于列表中的任何两个对象,排序条件可以相等。当对象相等并且在列表上应用排序时,列表顺序的行为不一致。下面是重现此行为的代码段。

--Creating the array 
x=[{Name:'h1', value: 1},{Name:'h2', value: 1},{Name:'h3', value: 1},{Name:'h4', value: 1},{Name:'h5', value: 1},{Name:'h6', value: 1},{Name:'h7', value: 1},{Name:'h8', value: 1},{Name:'h9', value: 1},{Name:'h10', value: 1},{Name:'h11', value: 1},{Name:'h12', value: 1},{Name:'h13', value: 1}]

--Sort the array
x.sort(function (a, b) {a = a.value;b = b.value;if (a < b)return -1;if (a > b) return 1; return 0;})    
--Results in order, 
--h7, h1, h3, h4, h5, h6, h2, h8, h9, h10, h11, h12, h13

--Sort the array again
x.sort(function (a, b) {a = a.value;b = b.value;if (a < b)return -1;if (a > b) return 1; return 0;})
--Results in order, 
--h2, h7, h3, h4, h5, h6, h1, h8, h9, h10, h11, h12, h13

1 个答案:

答案 0 :(得分:0)

从排序比较中返回0意味着对象是“相同的”。返回-1或1以告诉排序功能如何处理它。

由于您没有对字符串或数字的数组进行排序,而是对象,您需要告诉分拣机用于排序的属性。

.sort(function (a, b){
  if (a.Name < b.Name) { 
    return -1;
  };
  if (a.Name > b.Name) {
    return 1;
  };
  // Return 0, or decide to compare on something else.
  return 0;
});

由于比较字符串的方式,这将导致'h1,h10,h11,...'。如果你想将它排序为数字,h1,h2,h3,你需要在比较之前做一些额外的工作:

var result = x.sort(function (a, b){
    var anumber = parseInt(a.Name.substring(1));
    var bnumber = parseInt(b.Name.substring(1));
  if (anumber < bnumber) { 
    return -1;
  };
  if (anumber > bnumber) {
    return 1;
  };
  // Return 0, or decide to compare on something else.
  return 0;
});

这导致数组被排序为'h1,h2,h3,...'。有更多的方法可以做到这一点,但这是一个。