最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

js中的數(shù)組對象排序分析

 更新時間:2018年12月11日 23:37:48   作者:那時候的我  
這篇文章為大家分析一下js中的數(shù)組對象排序的一些知識,方便大家在以后使用中知道這些排序的原理

一、普通數(shù)組排序  

  js中用方法sort()為數(shù)組排序。sort()方法有一個可選參數(shù),是用來確定元素順序的函數(shù)。如果這個參數(shù)被省略,那么數(shù)組中的元素將按照ASCII字符順序進行排序。如:

var arr = ["a", "b", "A", "B"];
arr.sort();
console.log(arr);//["A", "B", "a", "b"]

因為字母A、B的ASCII值分別為65、66,而a、b的值分別為97、98,所以上面輸出的結(jié)果是 ["A", "B", "a", "b"] 。

  如果數(shù)組元素是數(shù)字呢,結(jié)果會是怎樣?

var arr = [15, 8, 25, 3];
arr.sort();
console.log(arr);//[15, 25, 3, 8]

結(jié)果是 [15, 25, 3, 8] 。其實,sort方法會調(diào)用每個數(shù)組項的toString()方法,得到字符串,然后再對得到的字符串進行排序。雖然數(shù)值15比3大,但在進行字符串比較時"15"則排在"3"前面。顯然,這種結(jié)果不是我們想要的,這時,sort()方法的參數(shù)就起到了作用,我們把這個參數(shù)叫做比較函數(shù)。

  比較函數(shù)接收兩個參數(shù),如果第一個參數(shù)應(yīng)該位于第二個之前則返回一個負數(shù),如果兩個參數(shù)相等則返回0,如果第一個參數(shù)應(yīng)該位于第二個之后則返回一個正數(shù)。例子:

var arr = [23, 9, 4, 78, 3];
var compare = function (x, y) {//比較函數(shù)
 if (x < y) {
 return -1;
 } else if (x > y) {
 return 1;
 } else {
 return 0;
 }
}
console.log(arr.sort(compare));

結(jié)果為 [3, 4, 9, 23, 78] ,返回了我們想要的結(jié)果。如果要按降序排序,比較函數(shù)寫成這樣即可:

var compare = function (x, y) {
 if (x < y) {
 return 1;
 } else if (x > y) {
 return -1;
 } else {
 return 0;
 }
}

我們并不能用比較函數(shù)比較一個不能轉(zhuǎn)化為數(shù)字的字符串與數(shù)字的順序:

var arr = ["b", 5];
console.log(arr.sort(compare))

結(jié)果是 ["b", 5] 。因為比較函數(shù)在比較時,會把先把字符串轉(zhuǎn)化為數(shù)字,然后再比較,字符串b不能轉(zhuǎn)化為數(shù)字,所以就不能比較大小。然而,當不用比較函數(shù)時,會比較ASCII值,所以結(jié)果是 [5, "b"] 。

二、數(shù)組對象排序

  如果數(shù)組項是對象,我們需要根據(jù)數(shù)組項的某個屬性對數(shù)組進行排序,要怎么辦呢?其實和前面的比較函數(shù)也差不多:

var arr = [{name: "zlw", age: 24}, {name: "wlz", age: 25}];
var compare = function (obj1, obj2) {
 var val1 = obj1.name;
 var val2 = obj2.name;
 if (val1 < val2) {
 return -1;
 } else if (val1 > val2) {
 return 1;
 } else {
 return 0;
 }  
} 
console.log(arr.sort(compare));

輸出結(jié)果為 [Object { name="wlz", age=25}, Object { name="zlw", age=24}] ,可以看到數(shù)組已經(jīng)按照 name 屬性進行了排序。我們可以對上面的比較函數(shù)再改造一下:

var compare = function (prop) {
 return function (obj1, obj2) {
 var val1 = obj1[prop];
 var val2 = obj2[prop];if (val1 < val2) {
  return -1;
 } else if (val1 > val2) {
  return 1;
 } else {
  return 0;
 }  
 } 
}

如果想按照 age 進行排序, arr.sort(compare("age")) 即可。

  但是對age屬性進行排序時需要注意了,如果age屬性的值是數(shù)字,那么排序結(jié)果會是我們想要的。但很多時候我們從服務(wù)器傳回來的數(shù)據(jù)中,屬性值通常是字符串。現(xiàn)在我把上面的數(shù)組改為:

var arr = [{name: "zlw", age: "24"}, {name: "wlz", age: "5"}];

可以看到,我把 age 屬性由數(shù)字改為了字符串,第二個數(shù)組項的 age 值改為了 "5" 。再次調(diào)用 arr.sort(compare("age")) 后,結(jié)果為:

[Object { name="zlw", age="24"}, Object { name="wlz", age="5"}]

我們的期望是5排在25前面,但是結(jié)果不是。這是因為當兩個數(shù)字字符串比較大小時,會比較它們的ASCII值大小,比較規(guī)則是:從第一個字符開始,順次向后直到出現(xiàn)不同的字符為止,然后以第一個不同的字符的ASCII值確定大小。所以"24"與"5"比較大小時,先比較”2“與"5"的ASCII值,顯然”2“的ASCII值比"5"小,即確定排序順序。

  現(xiàn)在,我們需要對比較函數(shù)再做一些修改:

var compare = function (prop) {
 return function (obj1, obj2) {
 var val1 = obj1[prop];
 var val2 = obj2[prop];
 if (!isNaN(Number(val1)) && !isNaN(Number(val2))) {
  val1 = Number(val1);
  val2 = Number(val2);
 }
 if (val1 < val2) {
  return -1;
 } else if (val1 > val2) {
  return 1;
 } else {
  return 0;
 }  
 } 
}

在比較函數(shù)中,先把比較屬性值轉(zhuǎn)化為數(shù)字 Number(val1) 再通過 !isNaN(Number(val1)) 判斷轉(zhuǎn)化后的值是不是數(shù)字(有可能是NaN),轉(zhuǎn)化后的值如果是數(shù)字,則比較轉(zhuǎn)換后的值,這樣就可以得到我們想要的結(jié)果了, 調(diào)用 arr.sort(compare("age")) 得到:

[Object { name="wlz", age="5"}, Object { name="zlw", age="24"}]

可以看到,確實是按正確的方式排序了。

  這篇文章所講的都是基礎(chǔ)的,沒什么技術(shù)含量,只是最近項目中遇到了對數(shù)組對象進行排序的問題,所以在這里寫出來分享一下,相信總能幫到一些朋友。

相關(guān)文章

  • JavaScript中神奇的call()方法

    JavaScript中神奇的call()方法

    這篇文章主要介紹了JavaScript中神奇的call()方法,本文用淺顯的語言幫助你加深理解call()方法,需要的朋友可以參考下
    2015-03-03
  • JS實現(xiàn)的鼠標跟隨代碼(卡通手型點擊效果)

    JS實現(xiàn)的鼠標跟隨代碼(卡通手型點擊效果)

    這篇文章主要介紹了JS實現(xiàn)的鼠標跟隨代碼,帶有卡通手型點擊效果.涉及JavaScript鼠標事件的響應(yīng)與頁面元素的動態(tài)調(diào)用技巧,需要的朋友可以參考下
    2015-10-10
  • javascript中的正則表達式使用詳解

    javascript中的正則表達式使用詳解

    之前講了javascript對正則表達式的實現(xiàn)方式了,只定義了正則表達式,但是如何在javascript中真正使用正則表達式呢?在javascript中RegExp和String對象都有處理正則表達式的方法。
    2015-08-08
  • 純JS 繪制數(shù)學(xué)函數(shù)

    純JS 繪制數(shù)學(xué)函數(shù)

    今天閑來無事用js寫了個數(shù)學(xué)繪圖包,還不算完整,不過總出現(xiàn)了雛形。
    2009-04-04
  • 微信JS-SDK實現(xiàn)微信會員卡功能(給用戶微信卡包里發(fā)送會員卡)

    微信JS-SDK實現(xiàn)微信會員卡功能(給用戶微信卡包里發(fā)送會員卡)

    這篇文章主要介紹了微信JS-SDK實現(xiàn)微信會員卡功能(給用戶微信卡包里發(fā)送會員卡),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • js實現(xiàn)仿微博滾動顯示信息的效果

    js實現(xiàn)仿微博滾動顯示信息的效果

    這篇文章主要介紹了js實現(xiàn)仿微博滾動顯示信息的效果,通過由上往下滾動來實現(xiàn)不斷顯示微博的,而且每一天新微博都是通過淡入效果顯示的,需要的朋友可以參考下
    2015-12-12
  • javascript實現(xiàn)的閉包簡單實例

    javascript實現(xiàn)的閉包簡單實例

    這篇文章主要介紹了javascript實現(xiàn)的閉包簡單實現(xiàn)方法,涉及javascript閉包的原理與實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • javascript實現(xiàn)仿IE頂部的可關(guān)閉警告條

    javascript實現(xiàn)仿IE頂部的可關(guān)閉警告條

    仿windows IE頂部的敬告工具條,帶關(guān)閉按鈕,設(shè)計還算精美,你完全可以用到自己的網(wǎng)頁用于顯示提示等方面,有需要的小伙伴可以參考下。
    2015-05-05
  • JS前端加密算法示例

    JS前端加密算法示例

    這篇文章主要介紹了JS前端加密算法,結(jié)合實例形式分析了crypto-js具體用法與注意事項,需要的朋友可以參考下
    2016-12-12
  • javascript 可控式透明特效實現(xiàn)代碼

    javascript 可控式透明特效實現(xiàn)代碼

    透明特效是script.aculo.us提到的特效中最簡單的特效之一。既然是特效,必須涉及時間與空間的概念。時間我們可以用setTimeout與setInterval,個人比較喜歡setTimeout,雖然它每次調(diào)用都重復(fù)注冊,但可控性比較好。
    2010-01-01

最新評論

应用必备| 普安县| 彰武县| 静安区| 汝阳县| 共和县| 镇宁| 霍州市| 格尔木市| 哈尔滨市| 七台河市| 德昌县| 河西区| 绵竹市| 芷江| 赞皇县| 柳林县| 达孜县| 莱西市| 龙泉市| 封开县| 上思县| 启东市| 小金县| 福泉市| 武邑县| 博乐市| 即墨市| 余干县| 敦煌市| 淮阳县| 兴和县| 巴南区| 从化市| 深圳市| 营口市| 台江县| 达尔| 邹平县| 清徐县| 张掖市|