在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
答案 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,...'。有更多的方法可以做到这一点,但这是一个。