js物件陣列排序,name字串排序,數字最前,然後英文,然後中文
阿新 • • 發佈:2019-01-01
/** * 將傳入的陣列根據當前系統語言,按照中文或英文名重新排序,會影響原陣列 * @param list 必填要排序的list * @returns {*} */ export function arraySortByName(list) { if (list === undefined || list === null) return [] list.sort((a, b) => { let strA = a.name let strB = b.name // 誰為非法值誰在前面 if (strA === undefined || strA === null || strA === '' || strA === ' ' || strA === ' ') { return -1 } if (strB === undefined || strB === null || strB === '' || strB === ' ' || strB === ' ') { return 1 } // 如果a和b中全部都是漢字,或者全部都非漢字 if ((strA.split('').every(char => notChinese(char)) && strB.split('').every(char => notChinese(char))) || (strA.split('').every(char => !notChinese(char)) && strB.split('').every(char => !notChinese(char)))) { return strA.localeCompare(strB) } else { const charAry = strA.split('') for (const i in charAry) { if ((charCompare(strA[i], strB[i]) !== 0)) { return charCompare(strA[i], strB[i]) } } // 如果通過上面的迴圈對比還比不出來,就無解了,直接返回-1 return -1 } }) return list } function charCompare(charA, charB) { // 誰為非法值誰在前面 if (charA === undefined || charA === null || charA === '' || charA === ' ' || charA === ' ') { return -1 } if (charB === undefined || charB === null || charB === '' || charB === ' ' || charB === ' ') { return 1 } // 如果都為英文或者都為漢字則直接對比 if ((notChinese(charA) && notChinese(charB)) || (!notChinese(charA) && !notChinese(charB))) { return charA.localeCompare(charB) } else { // 如果不都為英文或者漢字,就肯定有一個是英文,如果a是英文,返回-1,a在前,否則就是b是英文,b在前 if (notChinese(charA)) { return -1 } else { return 1 } } } function notChinese(char) { const charCode = char.charCodeAt(0) return charCode >= 0 && charCode <= 128 }