JS實現自定義排序


  定義:用本地特定的順序來比較兩個字符串。

  語法: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 = "*abcdefghjklmnopqrstwxyz".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。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM