js按多列排序,无法在IE和Safari中使用

时间:2014-06-23 22:40:58

标签: javascript jquery html ios arrays

this question中,数据按大多数排序,如果大多数是相等的,则按两位工人在同一天工作时选择更多水果的人排序。如下图所示

    var workers = [
        {"id":"111","name":"April", "most":"7","sd-111222":"1","sd-111333":"2","sd-111444":"2","sd-111555":"2"},
        {"id":"222","name":"Bruno", "most":"7","sd-111222":"2","sd-222333":"1","sd-222444":"2","sd-222555":"2"},
        {"id":"333","name":"Carlos","most":"6","sd-111333":"1","sd-222333":"2","sd-333444":"2","sd-333555":"1"},
        {"id":"444","name":"Dwayne","most":"5","sd-111444":"1","sd-222444":"1","sd-333444":"1","sd-444555":"2"},
        {"id":"555","name":"Ed",    "most":"5","sd-111555":"1","sd-222555":"1","sd-333555":"2","sd-444555":"1"}
    ];

        workers.sort(function(a,b) {
            return (a.most == b.most)
                    ? (b["sd-" + a.id + b.id] - a["sd-" + a.id + b.id])
                    : (b.most - a.most);               
        });
    workers.forEach(function(elm){
        console.log(elm["id"] + " " +elm["name"]);
    });

在FF / Chrome / Android / Chrome for Android中输出。

    222 Bruno
    111 April
    333 Carlos
    444 Dwayne
    555 Ed

在Safari和IE11中(必须更改为警报才能查看数据)和IOS的chrome只能在第二次排序中得到应用

    111 April
    222 Bruno
    333 Carlos
    444 Dwayne
    555 Ed

请参阅fiddle

这是为什么? 这些浏览器不支持什么? 我阅读了关于forEach的文档,这些文档在这些浏览器中没有提到任何支持问题,但是我认为它不是foreach的问题,因为排序事先发生了吗?

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach

1 个答案:

答案 0 :(得分:1)

当您尝试在a中查找信息时,您依赖于参数bsort的顺序来提供给workers的回调:

b["sd-" + a.id + b.id] - a["sd-" + a.id + b.id] 

此排序不可预测,并且在浏览器中似乎不一致。在Firefox上,我得到以下查询:

sd-111222 
sd-444555

在Safari上,我得到了这些(不存在相反的顺序):

sd-222111
sd-555444

你不应该依赖这种顺序。您要知道的是,您正在将名为a的数组中的某些元素与名为b的数组中的某些其他元素进行比较。你无法确定其他任何事情。