JavaScript之实现中文根据首字首字母排序、拼音、sort、localeCompare、split、indexOf、isFinite


汉字与字母纯属组

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()

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值