• JS排序:localeCompare() 方法实现中文排序、sort方法实现数字英文混合排序


    MDN Web Doc地址:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare

    定义:用本地特定的顺序来比较两个字符串。

      语法:stringObject.localeCompare(target)

      参数:target——要以本地特定的顺序与 stringObject 进行比较的字符串。

      返回值:说明比较结果的数字。

      (1)如果 stringObject 小于 target,则 localeCompare() 返回小于 0 的数。

      (2)如果 stringObject 大于 target,则该方法返回大于 0 的数。

      (3)如果两个字符串相等,或根据本地排序规则没有区别,该方法返回 0。

      说明:把 < 和 > 运算符应用到字符串时,它们只用字符的 Unicode 编码比较字符串,而不考虑当地的排序规则。以这种方法生成的顺序不一定是正确的。localeCompare() 方法提供的比较字符串的方法,考虑了默认的本地排序规则。ECMAscript 标准并没有规定如何进行本地特定的比较操作,它只规定该函数采用底层操作系统提供的排序规则。

      实例:

    1、可以使用localeCompare() 方法来实现中文按照拼音排序,方法相当简单

    var array = ['张三', '李四', '王五', '赵六', '七宝', "八爷"];
    array = array.sort(function compareFunction(item1, item2) {
        return item1.localeCompare(item2);
    });
    //八爷,李四,七宝,王五,张三,赵六
    

    而且可以通过如下代码实现中文按照拼音排序,并且可以将中文按照a,b,c,d……进行区分。代码如下:

    function pySegSort(arr,empty) {
        if(!String.prototype.localeCompare)
            return null;
    
        var letters = "*abcdefghijklmnopqrstuvwxyz".split('');
        var zh = "阿八嚓的风格哈些捷克罗姆弄破嵌入式图五项原则".split('');
    
        var segs = [];
        var curr;
        $.each(letters, function(i){
            curr = {letter: this, data:[]};
            $.each(arr, function() {
                if((!zh[i-1] || zh[i-1].localeCompare(this) <= 0) && this.localeCompare(zh[i]) == -1) {
                    curr.data.push(this);
                }
            });
            if(empty || curr.data.length) {
                segs.push(curr);
                curr.data.sort(function(a,b){
                    return a.localeCompare(b);
                });
            }
        });
        return segs;
    }
    console.log(JSON.stringify(pySegSort(['白鸽', '麻雀','黑','大象', '狗', '猫','妈妈','马', "鸡",'瘦','胖'])));
    

    结果显示为:[{"letter":"b","data":["白鸽"]},{"letter":"d","data":["大象"]},{"letter":"g","data":["狗"]},{"letter":"h","data":["黑"]},{"letter":"j","data":["鸡"]},{"letter":"m","data":["妈妈","麻雀","马","猫"]},{"letter":"p","data":["胖"]},{"letter":"s","data":["瘦"]}];通过这个就可以写一个电话薄,像现在手机上面的,通过人名来进行分组、排序,之后再通过循环和布局就可以实现电话薄的功能。

    2、实现字母、数字的混合排序:

    var d = [1,2,3,'a','k','b','d',10,20,'c']  
    d.sort(function(a,b){  
        var c = isFinite(a), // 如果 number 是有限数字(或可转换为有限数字),那么返回 true。否则,如果 number 是 NaN(非数字),或者是正、负无穷大的数,则返回 false。  
            d = isFinite(b);  
        return (c != d && d - c) || a > b;  
    })  
    console.log(d);
    //[1, 2, 3, 10, 20, "a", "b", "c", "d", "k"]
    

    isFinite() 判断a、b是否是数字。

    return 后面的语句:

    c != d && c - d 如果c和d不相等 ,也就是说比较的值不是同一类型。那就比较 c-d的值是1还是-1(中间进行了隐式类型转换)

    如果c == d 也就是说c、d是同一类型的值,c、d可能都是字母,也可能都是数字。这里就可以直接比较大小了(都是字母的话不能直接做减法)。
    isFinite() 函数用于检查其参数是否是无穷大。如果 number 是有限数字(或可转换为有限数字),那么返回 true。否则,如果 number 是 NaN(非数字),或者是正、负无穷大的数,则返回 false。

    通过使用sort()和localeCompare()来实现一个简单的对数字、中英文等都能排序的方法:

    //对数据进行排序
    _sortData = (dataList,sortType,field)=>{
        //拷贝一份数据
        dataList = dataList.slice(0);
        //判断是否含有非数字
        let isNumber = dataList.some(item=>{
            return isNaN(field ? item[field] : item);
        });
        if(sortType === 'asc'){
            //升序
            if(!isNumber){
                //数字排序
                dataList.sort((dataA,dataB)=>{
                    return (field 
                        ? +dataA[field] - +dataB[field]
                        : +dataA - +dataB);
                });
            }else{
                //非数字排序
                dataList.sort((dataA,dataB)=>{
                    return (field
                        ? dataA[field].localeCompare(dataB[File])
                        : dataA.localeCompare(dataB));
                })
            }
        }else if(sortType === 'desc'){
            //降序
            //升序
            if(!isNumber){
                //数字排序
                dataList.sort((dataA,dataB)=>{
                    return (field 
                        ? +dataB[field] - +dataA[field]
                        : +dataB - +dataA);
                });
            }else{
                //非数字排序
                dataList.sort((dataA,dataB)=>{
                    return (field
                        ? dataB[field].localeCompare(dataA[File])
                        : dataB.localeCompare(dataA));
                })
            }
        }
        return dataList;
    }
    

    参考:https://www.cnblogs.com/goloving/p/7662676.html

    砥砺前行
  • 相关阅读:
    并查集分析+总结
    poj 3083 Children of the Candy Corn(bfs+dfs 数组模拟方向)
    poj 1094 Sorting It All Out (拓扑排序)
    poj 2632 Crashing Robots(模拟)
    poj 1068 Parencodings (模拟)
    poj 1273 Drainage Ditches ( 最大流Edmonds_karp算法)
    poj 3278 Catch That Cow (BFS)
    Codeforces Round #109 (Div. 2) 总结
    poj 2299 UltraQuickSort(归并排序)
    poj 1035 Spell checker(字符串)
  • 原文地址:https://www.cnblogs.com/lhongsen/p/14808992.html
Copyright © 2020-2023  润新知