前不久同事的代碼中出了一個(gè)很神奇的問(wèn)題,大致流程是對(duì)一個(gè)由對(duì)象組成的數(shù)組進(jìn)行排序,其中屬性 a 用于排序,屬性 b 作為一個(gè)優(yōu)選條件,當(dāng) b 等于 1 的時(shí)候無(wú)論 a 值是什么,都排在開頭 。這本是一個(gè)很簡(jiǎn)單的問(wèn)題,問(wèn)題就在于他用兩次 sort 實(shí)現(xiàn)在這次排序,先根據(jù) a 的屬性排序,然后再根據(jù) b 的值來(lái)排序。問(wèn)題就出在第二次排序中。
我們想當(dāng)然的會(huì)認(rèn)為在第一次排序中,數(shù)組已經(jīng)根據(jù) a 的屬性由大到小排序,在第二次中我們只要不去動(dòng)原數(shù)組的順序就行(一般在方法中寫成返回0或-1),只考慮單獨(dú)把 b 等于 1 的元素提到前面去。但是其實(shí)這與語(yǔ)言所選用的排序算法有關(guān),javascript (和一起其他語(yǔ)言)內(nèi)置的 sort 方法采用的是幾種排序算法的集合,有時(shí)并不能保證相同元素的位置保持一致。
下面是從 stackoverflow 上面找來(lái)的一個(gè)例子
arrayToSort.sort(function (a, b) {
return b.strength - a.strength;
});
arrayToSort.forEach(function (element) {
console.log(element.name);
});
我們會(huì)以為最后元素的值還是從 a 到 t,但實(shí)際運(yùn)行下來(lái)的結(jié)果卻是亂序的,這是因?yàn)?sort 的算法并沒有保留原數(shù)組的順序,也即 unstable。
那么我們就該盡量避免這種情況發(fā)生,就我同事的例子,將兩次 sort 的邏輯合并在一次中應(yīng)該是個(gè)可行的辦法,如果必須分為多次 sort,那么就把原數(shù)組的順序記錄在元素的屬性上把。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注