JavaScript排序国家数组

时间:2014-01-10 17:59:31

标签: javascript arrays sorting

我正在对一组国家/地区进行排序,每个国家/地区都有一个数据权重属性,我在自定义排序函数中使用该属性。 此时,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,该函数无序返回。

例如...结果返回为:
美利坚合众国 莫桑比克
阿鲁巴岛 澳大利亚
奥地利 白俄罗斯

任何人都知道为什么会发生这种情况?

3 个答案:

答案 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>