0503|937. 重新排列日志文件
对 sort 的灵活运用。
var reorderLogFiles = function (logs) {
// 保存 0 和 9 字母的code值
const ZERO = '0'.charCodeAt(0); // 48
const NINE = '9'.charCodeAt(0); // 57
// 原地排序
logs.sort((a, b) => {
// 判断是否为数字日志:dig开头。
// 思路:题干说“数字日志的所有字均由数字组成”,
// 所以:判断最后一个字符是否为数字。
const aDig = a.charCodeAt(a.length - 1) >= ZERO && a.charCodeAt(a.length - 1) <= NINE;
const bDig = b.charCodeAt(b.length - 1) >= ZERO && b.charCodeAt(b.length - 1) <= NINE;
// console.log(a, '->', aDig, '||', b, "->", bDig);
if (aDig && bDig) return 0; // 都是数字:保留相对位置
else if (aDig) return 1; // 如果只有a是数字,则a排在后面;反之亦然
else if (bDig) return -1;
// 都是false,都是字母日志:
// 由空格把 string 切割为 array :eg. "let1 art can" ==> ['let2', 'own', 'kit', 'dig']
const [aSp, bSp] = [a.split(" "), b.split(" ")];
// slice(1) 删去数组第一个成员,其为字母标识符。
// join(" ") 把 array 合并为 string。
// localeCompare 比较两个字符串,按照字典顺序谁应当排在前面。
const cmp = aSp.slice(1).join(" ").localeCompare(bSp.slice(1).join(" "));
// console.log(aSp, bSp, cmp);
if (cmp != 0) return cmp;
// 如果内容相同,则按照标识符排序
return aSp[0].localeCompare(bSp[0]);
})
return logs;
};