我正在对一组国家/地区进行排序,每个国家/地区都有一个数据权重属性,我在自定义排序函数中使用该属性。 此时,a_weight和b_weight是0或1(整数)。 “美利坚合众国”是数据权重为1的唯一元素,每个其他元素的数据权重为0。
...
return results.sort(sortOnWeight);
}
function sortOnWeight(a,b) {
a_weight = parseInt($(a['element'][0]['attributes']['data-weight']).val(), 10);
b_weight = parseInt($(b['element'][0]['attributes']['data-weight']).val(), 10);
if (a_weight > b_weight){
return -1;
} else if (a_weight < b_weight) {
return 1;
} else {
return 0;
}
}
对于击中'sortOnWeight'函数的最后一个项目,该数组返回正确的EXCEPT,该函数无序返回。
例如...结果返回为:
美利坚合众国
莫桑比克
阿鲁巴岛
澳大利亚
奥地利
白俄罗斯
任何人都知道为什么会发生这种情况?
答案 0 :(得分:3)
看起来你依赖浏览器排序算法是稳定的。情况并非总是如此(请参阅this issue for V8作为示例)。
编辑:有关V8排序here的更多信息。显然,长度<= 10的数组使用稳定的排序,而长度> = 11使用更快的不稳定排序。
如果权重相等,您应该按文字排序。可以使用>
和<
运算符(MDN reference)进行字符串比较。比较区分大小写,大写排序高于小写("abc" > "Abc"
),因此您可能需要使用toLowerCase
/ toUpperCase
来捏造结果。
function sortOnWeight(a,b) {
var a_weight = parseInt($(a['element'][0]['attributes']['data-weight']).val(), 10);
var b_weight = parseInt($(b['element'][0]['attributes']['data-weight']).val(), 10);
var a_text;
var b_text;
if (a_weight > b_weight){
return -1;
}
else if (a_weight < b_weight) {
return 1;
}
else {
a_text = /* get text from a */
b_text = /* get text from b */
return a_text > b_text;
}
}
答案 1 :(得分:0)
从Mozilla文档sort
被视为不稳定:
排序不一定稳定。默认排序顺序是词典(非数字)。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
ES文档中也提到了这一点:
排序不一定稳定(也就是说,比较相等的元素不一定保持原始顺序)。
http://www.ecma-international.org/ecma-262/5.1/#sec-15.4.4.11
答案 2 :(得分:0)
我只是想亲自尝试一下,所以创建了一个带有国家名称和重量的新2D阵列,并尝试根据重量进行排序。它令我满意,美国出现在顶部,看下面的代码可能对你有所帮助。当然,这是过于简单的,其他人提供的链接有更多的好信息,可能需要根据你的情况。
<!DOCTYPE html> <html> <body>
<script type = "text/javascript"> var countries = [["Aruba", 0],["Australia", 0],["Austria", 0],["Belarus", 0],["United States of America", 1], ["Mozambique", 0]];
var list = "unsorted :"; for (var i=0;i<countries.length;i++) { list +=countries[i]; list+= " "; }
alert('unsorted array:' + countries);
countries =countries.sort(function(a,b){ return (a[1] > b[1] ? -1 : (a[1] < b[1] ? 1 : 0)); });
list = "sorted :"; for (var i=0;i<countries.length;i++) { list +=countries[i]; list+= " "; }
alert('sorted array:' + countries);
</script>
</body> </html>