JavaScript Sort 的一个错误用法示例
前不久同事的代码中出了一个很神奇的问题,大致流程是对一个由对象组成的数组进行排序,其中属性a用于排序,属性b作为一个优选条件,当b等于1的时候无论a值是什么,都排在开头。这本是一个很简单的问题,问题就在于他用两次sort实现在这次排序,先根据a的属性排序,然后再根据b的值来排序。问题就出在第二次排序中。
我们想当然的会认为在第一次排序中,数组已经根据a的属性由大到小排序,在第二次中我们只要不去动原数组的顺序就行(一般在方法中写成返回0或-1),只考虑单独把b等于1的元素提到前面去。但是其实这与语言所选用的排序算法有关,javascript(和一起其他语言)内置的sort方法采用的是几种排序算法的集合,有时并不能保证相同元素的位置保持一致。
下面是从stackoverflow上面找来的一个例子
vararrayToSort=[ {name:'a',strength:1},{name:'b',strength:1},{name:'c',strength:1},{name:'d',strength:1}, {name:'e',strength:1},{name:'f',strength:1},{name:'g',strength:1},{name:'h',strength:1}, {name:'i',strength:1},{name:'j',strength:1},{name:'k',strength:1},{name:'l',strength:1}, {name:'m',strength:1},{name:'n',strength:1},{name:'o',strength:1},{name:'p',strength:1}, {name:'q',strength:1},{name:'r',strength:1},{name:'s',strength:1},{name:'t',strength:1} ];
arrayToSort.sort(function(a,b){ returnb.strength-a.strength; });
arrayToSort.forEach(function(element){ console.log(element.name); });