汉字与字母纯属组
function chineseCharacterSorting(list) {
return list.sort((a, b) => a.localeCompare(b));
}
console.log(chineseCharacterSorting(['白鸽', 'A', '麻雀', '大大咧咧', 'c', 'B', '张聊聊', '苟苟营', '猫猫狗狗', "唧唧复唧唧", 'a']));
// ['白鸽', '大大咧咧', '苟苟营', '唧唧复唧唧', '麻雀', '猫猫狗狗', '张聊聊', 'a', 'A', 'B', 'c']
汉字与字母对象(有问题,只有汉字正确排序)
function pySegSort(arr) {
if (!String.prototype.localeCompare) return false;
let letters = "*abcdefghjklmnopqrstwxyz".split(''),
zh = "阿八嚓哒妸发旮哈讥咔垃痳拏噢妑七呥扨它穵夕丫帀".split(''),
segs = [],
curr = {};
letters.forEach(item => {
curr = {
letter: item,
data: []
};
arr.forEach(items => {
let i = letters.indexOf(item),
isI = !zh[i - 1],
isILC = zh[i - 1] ? zh[i - 1].localeCompare(items) <= 0 : zh[i - 1],
isLCI = items.localeCompare(zh[i]) === -1,
isTF = (isI || isILC) && isLCI;
if (isTF) curr.data.push(items);
});
if (curr.data.length) {
segs.push(curr);
curr.data.sort((a, b) => a.localeCompare(b));
}
});
return segs;
}
console.log(pySegSort(['赵匡胤', '百善', '黑乎乎', '豺狼', 'j', '狼狈为奸', '虎豹', '苟苟营', '妙不可言', 'M', '叶良辰', '马首是瞻', '一个人生活', "鸡飞蛋打", 'a', '庞士元', '瘦骨嶙峋']));
// [{…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}]
数字与字母
function numberLetterSort(list) {
return list.sort(function (a, b) {
// 如果number是有限数字(或可转换为有限数字),
// 那么返回true。
// 否则,如果number是NaN(非数字),
// 或者是正、负无穷大的数,则返回false。
let c = isFinite(a),
d = isFinite(b),
e = (c != d && d - c) || (c && d ? a - b : a.localeCompare(b));
return e;
});
}
console.log(numberLetterSort([3, 1, 'a', 'k', 'b', 20, 10, 'c', 'C']));
// [1, 3, 10, 20, 'a', 'b', 'c', 'C', 'k']
isFinite
W3SCHOOL
isFinite()函数可确定数字是否是有限的合法数字。
如果值为+infinity、-infinity或NaN(非数字),则此函数返回false,否则返回true。
MDN
该全局isFinite()函数用来判断被传入的参数值是否为一个有限数值(finite number)。在必要情况下,参数会首先转为一个数值。
indexOf
MDN
indexOf()方法返回数组中第一次出现给定元素的下标,如果不存在则返回-1。
w3school
indexOf()方法返回值在字符串中第一次出现的位置。
如果未找到该值,则indexOf()方法返回-1。
indexOf()方法区分大小写。
split
w3school
split()方法将字符串拆分为子字符串数组。
split()方法返回新数组,不会更改原始字符串。
如果 (" ") 用作分隔符,则字符串在单词之间进行拆分。
MDN
split()方法接受一个模式,通过搜索模式将字符串分割成一个有序的子串列表,将这些子串放入一个数组,并返回该数组。
localeCompare
MDN
localeCompare()方法返回一个数字,表示参考字符串在排序顺序中是在给定字符串之前、之后还是与之相同。在支持Intl.Collator API的实现中,该方法仅是调用了Intl.Collator方法。
当比较大量字符串时,例如对大型数组进行排序,最好创建一个Intl.Collator对象,并使用其compare() (en-US)方法提供的函数。
W3SCHOOL
localeCompare()方法在当前语言环境中比较两个字符串。
localeCompare()方法返回排序顺序-1、1或0(表示之前、之后或相等)。
当前语言环境基于浏览器的语言设置。
sort
w3school
sort()方法对数组的项目进行排序。
排序顺序可以是按字母或数字,也可以是升序(向上)或降序(向下)。
默认情况下,sort()方法将按字母和升序将值作为字符串进行排序。
这适用于字符串(Apple出现在Banana之前)。但是,如果数字按字符串排序,则25大于100,因为2大于1。
正因为如此,sort()方法在对数字进行排序时会产生不正确的结果。
您可以通过提供“比较函数”来解决此问题。
sort()方法会改变原始数组。
MDN
sort()方法就地对数组的元素进行排序,并返回对相同数组的引用。默认排序是将元素转换为字符串,然后按照它们的UTF-16码元值升序排序。
由于它取决于具体实现,因此无法保证排序的时间和空间复杂度。
如果想要不改变原数组的排序方法,可以使用toSorted()。