国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

如何在JavaScript中對對象數組進行排序

開發 前端
如果需要按特定順序對對象數組進行排序,我們很有可能會直接找個 JS 庫來用。其實大可不必,JS 原生中的 Array.sort就能直接一些復雜又漂亮的排序。

 [[354152]]

如果需要按特定順序對對象數組進行排序,我們很有可能會直接找個 JS 庫來用。其實大可不必,JS 原生中的 Array.sort就能直接一些復雜又漂亮的排序。

本文中,將介紹一些 Array.sort 的常規排序和一些騷操作。

基本數組排序

默認情況下,Array.sort函數將數組中需要排序的每個元素轉換為字符串,并按 Unicode 順序對其進行比較。

  1. const foo = [9, 1, 4, 'zebroid''afterdeck']; 
  2. foo.sort(); // returns [ 1, 4, 9, 'afterdeck''zebroid' ] 
  3.  
  4. const bar = [5, 18, 32, new Set, { user'Eleanor Roosevelt' }]; 
  5. bar.sort(); // returns [ 18, 32, 5, { user'Eleanor Roosevelt' }, Set {} ] 

你可能會好奇為啥32排在5之前。發生這種情況是因為數組中的每個元素都首先轉換為字符串,并且按照Unicode順序,"32"在"5"之前。

需要注意的是,Array.sort會更改原數組。

  1. const baz = ['My cat ate my homework', 37, 9, 5, 17]; 
  2. baz.sort(); // baz數組被修改 
  3. console.log(baz); // shows [ 17, 37, 5, 9, 'My cat ate my homework' ] 

為避免這種情況,我們可以創建要排序的數組的新實例,然后在新的數組上進行修改。這里可以使用 Array.slice它返回是一個新的數組實例。

  1. // 創建baz數組的新實例并對其進行排序 
  2. const sortedBaz = baz.slice().sort(); 

我們還可以使用 ES6 中的展開運算符來做:

  1. const sortedBaz = [...baz].sort();  

在兩種情況下,輸出是相同的:

  1. console.log(baz); // ['My cat ate my homework', 37, 9, 5, 17]; 
  2. console.log(sortedBaz); // [ 17, 37, 5, 9, 'My cat ate my homework' ] 

單獨使用Array.sort不能對對象數組進行排序。但不必擔心,sort 的還提供一個參數,該參數使數組元素根據compare函數的返回值進行排序。

使用比較函數進行排序

假設foo和bar是compare函數要比較的兩個元素,compare函數的返回值設置如下:

  1. 小于0:foo在bar之前
  2. 大于0 :bar在foo之前
  3. 等于0:foo和bar彼此保持不變。

來看一個簡單的示例:

  1. const nums = [79, 48, 12, 4]; 
  2.  
  3. function compare(a, b) { 
  4.   if (a > b) return 1; 
  5.   if (b > a) return -1; 
  6.  
  7.   return 0; 
  8.  
  9. nums.sort(compare); 
  10. // => 4, 12, 48, 79 

我們可以稍微重構一下:

  1. function compare(a, b) { 
  2.   return a - b; 

使用在使用箭頭函數進行重構:

  1. nums.sort((a, b) => a - b); 

如何對對象數組進行排序

現在,我們來按一下對對象數組的排序。假設有下面的 singers 數組:

  1. const singers = [ 
  2.   { name'Steven Tyler', band: 'Aerosmith', born: 1948 }, 
  3.   { name'Karen Carpenter', band: 'The Carpenters', born: 1950 }, 
  4.   { name'Kurt Cobain', band: 'Nirvana', born: 1967 }, 
  5.   { name'Stevie Nicks', band: 'Fleetwood Mac', born: 1948 }, 
  6. ]; 

我們可以使用 compare函數,然后根據 singers 中的 band 字段來進行排序。

  1. function compare(a, b) { 
  2.   // 使用 toUpperCase() 忽略字符大小寫 
  3.   const bandA = a.band.toUpperCase(); 
  4.   const bandB = b.band.toUpperCase(); 
  5.  
  6.   let comparison = 0; 
  7.   if (bandA > bandB) { 
  8.     comparison = 1; 
  9.   } else if (bandA < bandB) { 
  10.     comparison = -1; 
  11.   } 
  12.   return comparison; 
  13.  
  14. singers.sort(compare); 
  15.  
  16. /* returns [ 
  17.   { name'Steven Tyler', band: 'Aerosmith',  born: 1948 }, 
  18.   { name'Stevie Nicks', band: 'Fleetwood Mac', born: 1948 }, 
  19.   { name'Kurt Cobain', band: 'Nirvana', born: 1967 }, 
  20.   { name'Karen Carpenter', band: 'The Carpenters', born: 1950 } 
  21. ] */ 

如果要讓上面的順序相反,可以這么做:

  1. function compare(a, b) { 
  2.   ... 
  3.  
  4.   // 乘以-1來反轉返回值 
  5.   return comparison * -1; 

創建一個動態排序函數

最后,排序函數更具動態性。

我們創建一個排序函數,可以使用該函數對一組對象進行排序,這些對象的值可以是字符串或數字。該函數有兩個參數-我們要排序的鍵和返回結果的順序(即升序或降序):

  1. const singers = [ 
  2.   { name'Steven Tyler', band: 'Aerosmith', born: 1948 }, 
  3.   { name'Karen Carpenter', band: 'The Carpenters', born: 1950 }, 
  4.   { name'Kurt Cobain', band: 'Nirvana', born: 1967 }, 
  5.   { name'Stevie Nicks', band: 'Fleetwood Mac', born: 1948 }, 
  6. ]; 
  7.  
  8. function compareValues(keyorder = 'asc') { 
  9.   return function innerSort(a, b) { 
  10.     if (!a.hasOwnProperty(key) || !b.hasOwnProperty(key)) { 
  11.       // 該屬性在其中一個對象上不存在 
  12.       return 0; 
  13.     } 
  14.  
  15.     const varA = (typeof a[key] === 'string'
  16.       ? a[key].toUpperCase() : a[key]; 
  17.     const varB = (typeof b[key] === 'string'
  18.       ? b[key].toUpperCase() : b[key]; 
  19.  
  20.     let comparison = 0; 
  21.     if (varA > varB) { 
  22.       comparison = 1; 
  23.     } else if (varA < varB) { 
  24.       comparison = -1; 
  25.     } 
  26.     return ( 
  27.       (order === 'desc') ? (comparison * -1) : comparison 
  28.     ); 
  29.   }; 

使用:

  1. //數組按`band`排序,默認為升序 
  2. singers.sort(compareValues('band')); 
  3.  
  4. // 數組按 `band` 降序排序 
  5. singers.sort(compareValues('band''desc')); 
  6.  
  7. // 數組按 `name` 升序排序 
  8. singers.sort(compareValues('name')); 
  9.  
  10. // 數 組born 降序排序 
  11. singers.sort(compareValues('born''desc')); 

在上面的代碼中,hasOwnProperty方法用于檢查指定的屬性是否在每個對象上定義,且沒有通過原型鏈繼承。如果沒有在兩個對象上定義,函數返回0,排序順序保持不變(即對象之間保持不變)。

typeof運算符還用于檢查屬性值的數據類型,這使函數可以確定對數組進行排序的正確方法。如果指定屬性的值是一個字符串,則使用toUpperCase方法將其所有字符都轉換為大寫,因此排序時將忽略字符大小寫

最后,你可以根據自己需求來調整上面的函數。

String.prototype.localeCompare()

在上面的示例中,我們希望能夠對對象數組進行排序,其值可以是字符串或數字。但是,如果我們知道處理值是字符串的對象,則可以使用 JS 的localeCompare方法

比較兩個字符串,并返回下列值中的一個:

  • 如果 字符串 在 字母 表中 應該 排在 字符串 參數 之前, 則 返回 一個 負數;
  • 如果 字符串 等于 字符串 參數, 則 返回 0;
  • 字符串 在 字母 表中 應該 排在 字符串 參數 之后, 則 返回 一個 正數;
  1. ['bjork''Bjork''Björk'].sort(); 
  2. // [ 'Bjork''Björk''bjork' ] 
  3.  
  4. ['bjork''Bjork''Björk'].sort((a, b) => a.localeCompare(b)); 
  5. //  [ 'bjork''Bjork''Björk' ] 

根據compareValues函數,我們可以這么寫:

  1. function compareValues(keyorder = 'asc') { 
  2.   return function innerSort(a, b) { 
  3.     if (!a.hasOwnProperty(key) || !b.hasOwnProperty(key)) return 0; 
  4.     const comparison = a[key].localeCompare(b[key]); 
  5.  
  6.     return ( 
  7.       (order === 'desc') ? (comparison * -1) : comparison 
  8.     ); 
  9.   }; 

總結

上面就是使用普通JS 函數對對象數組排序的簡短的介紹。盡管許多庫都提供了這種動態排序能力,但我們自己實現這個方法其實也不信。另外,了解幕后發生了對我們來說并沒有壞處。

今天就跟大家分享到這里了,感謝大家的觀看,我們下期再見。

作者:James Hibbard 譯者:前端小智 來源:sitepoint

原文:https://www.sitepoint.com/sort-an-array-of-objects-in-javascript/

本文轉載自微信公眾號「大遷世界」,可以通過以下二維碼關注。轉載本文請聯系大遷世界公眾號。

 

責任編輯:武曉燕 來源: 大遷世界
相關推薦

2021-03-18 10:45:02

JavaScript數組運算符

2021-03-11 23:43:20

JavaScript數組開發

2018-10-11 09:40:53

前端JavaScript編程語言

2021-11-08 10:58:08

變量依賴圖排序

2024-04-11 08:30:05

JavaScript數組函數

2015-07-06 09:59:56

JavaScript私有成員

2025-02-10 10:29:32

2023-04-26 15:19:36

JavaScripMap數組

2020-12-08 08:07:41

JavaScript中等分數組

2025-01-09 09:14:44

2022-01-21 10:58:39

JavaScriptGolangPython

2024-10-22 15:10:49

2019-04-23 15:20:26

JavaScript對象前端

2011-03-21 12:41:41

JavaScript

2009-11-24 17:45:47

PHP數組排序函數ar

2020-08-23 11:32:21

JavaScript開發技術

2021-06-03 10:00:47

JavaScript 前端數克隆對象

2022-03-15 07:55:09

JavaScript線性儀表圖開發

2021-05-17 14:02:38

Swift 多重排序

2016-08-03 17:23:47

javascripthtml前端
點贊
收藏

51CTO技術棧公眾號

2020最新国产精品| 久久精品亚洲| 精品视频在线免费观看| 国产精品av免费观看| 日韩视频一二区| 欧美色老头old∨ideo| 国产精品免费观看久久| 一区二区三区在线电影| 久久亚洲精品网站| 97超碰人人在线| 欧美国产精品专区| 中文字幕精品—区二区日日骚| 成人女性视频| 日韩色av导航| 超碰资源在线| 色婷婷av一区二区三区软件| 蜜臀av免费观看| 国产精品911| 日韩久久久久久久| 97精品国产| 97成人精品视频在线观看| 欧美亚洲日本精品| 日韩一区二区在线看| 久草福利在线视频| 亚洲精品国产视频| 十八禁视频网站在线观看| 亚洲综合日本| 亚洲高清免费在线观看| 最新黄网在线观看| 国产在线看一区| 91传媒免费看| 999视频精品| 岛国av在线不卡| 国产资源在线免费观看| 日韩福利视频一区| 一区二区三区免费| 日韩少妇中文字幕| 二吊插入一穴一区二区| 69久久99精品久久久久婷婷| 国产妇女馒头高清泬20p多| 国产日韩另类视频一区| 久久久综合视频| 亚洲free嫩bbb| 992tv在线影院| 亚洲盗摄视频| 精品久久久久久久无码 | 久久久午夜视频| 亚洲精品欧美综合四区| 色偷偷av亚洲男人的天堂| 亚洲欧美卡通另类91av| 午夜伦理福利在线| av成人动漫| 欧美一区少妇| 国产mv久久久| 欧美性猛片xxxx免费看久爱| 免费在线一区观看| 亚洲日本一区二区三区在线| 一个人免费观看视频www在线播放| 欧美大陆一区二区| 精品国产一区二区三区四区在线观看 | 欧美精品日韩综合在线| 日本成人一区二区三区| 欧美国产一区二区三区激情无套| 欧美日韩一区二区精品| 国产精品人人做人人爽| 免费毛片b在线观看| 一本色道久久88综合亚洲精品ⅰ| 成人6969www免费视频| 18av.com视频| 欧美野外猛男的大粗鳮| 99精品国产视频| 中文字幕在线三区| 日韩av在线电影观看| 欧美美女一区二区| 第一社区sis001原创亚洲| 成人在线视频一区二区三区| 欧美视频在线视频| japanese色系久久精品| 人妻少妇精品久久| 欧美日韩国产高清一区二区三区 | av中文字幕一区| 在线观看黄av| 亚洲字幕一区二区| 国产欧美一区二区精品性| 精品日本视频| 四虎4hu永久免费入口| 亚洲精品一区二区三区影院| 精品av久久久久电影| 午夜网站在线观看| 中文字幕v亚洲ⅴv天堂| 精品福利电影| av毛片在线播放| 成人黄色免费网站在线观看| 福利视频一区二区| 欧美破处大片在线视频| 黄色无遮挡网站| 国产做受高潮69| 精品福利在线看| 国产欧美激情| 高清毛片在线观看| 69堂免费视频| 亚洲免费视频网站| 狠狠色狠狠色综合| 99国产精品久久一区二区三区| 日本男女交配视频| 亚洲欧美中文日韩v在线观看| 亚洲色图制服诱惑| 日韩欧美一区二区三区在线视频| 又爽又大又黄a级毛片在线视频| 精品视频高清无人区区二区三区| 欧美精品在线一区二区三区| 在线欧美视频| 欧美日本三级| 国产国语**毛片高清视频| 成人性生交大片免费看小说| 日韩一区二区在线观看视频| 国内一区二区在线| 中国av一区| se在线电影| 超碰96在线| 日本在线观看a| 国内偷自视频区视频综合| 国产精品视频公开费视频| 92福利视频午夜1000合集在线观看| 在线免费观看一区二区三区| 激情亚洲综合网| 福利在线视频网站| 中文有码在线观看| 免费在线观看视频a| 奇米影视亚洲狠狠色| 亚洲视频网站在线观看| 91小视频免费观看| 成人中文在线| 日本在线观看大片免费视频| 日韩人妻精品无码一区二区三区| 欧美亚洲视频在线看网址| 亚洲天堂精品在线观看| 三区四区在线视频| 999www成人| 亚洲五月天综合| 福利在线免费| 国产精品视频二| 国产欧美日韩最新| 久久久999精品免费| 日韩风俗一区 二区| 色94色欧美sute亚洲线路一ni | 免费拍拍拍网站| 午夜大尺度福利视频| 涩爱av在线播放一区二区| 精品欧美色视频网站在线观看 | 日韩欧美ww| 在线观看a视频| 黄色一级片视频| 黄色免费在线播放| 酒色婷婷桃色成人免费av网| 三级av在线| 91av在线网站| 久久久精品黄色| 国产69精品久久| 国产精品igao激情视频| 亚洲精品视频免费在线观看| 久久精品二区亚洲w码| 欧美韩日亚洲| 四虎一区二区| 亚洲国产欧美在线成人app| 青青草国产成人99久久| 9lporm自拍视频区在线| 中文字幕色一区二区| 精品国产三级电影在线观看| 美腿丝袜亚洲三区| av激情成人网| 亚洲 欧美 日韩系列| 69视频在线免费观看| 亚洲一区二区三区不卡国产欧美| 不卡中文字幕| 精品99又大又爽又硬少妇毛片| 激情久久av| 日韩精品视频在线| 91麻豆免费观看| 国产永久精品大片wwwapp| 狠狠v欧美ⅴ日韩v亚洲v大胸| 精品国产二区在线| 亚洲精品www久久久| www.亚洲在线| 天天做夜夜做人人爱精品| 青青青草原在线| 香蕉久久夜色| 理论片在线不卡免费观看| 一区2区3区在线看| 亚洲国产一区二区精品专区| 欧美日韩经典丝袜| 啊啊啊一区二区| 国产欧美日韩丝袜精品一区| 91精品国产色综合久久不卡电影 | 国产成人精品一区二区三区免费| 日本老熟妇毛茸茸| av噜噜色噜噜久久| 中文字幕欧美专区| 亚洲一区二三区| 久久精品国产精品亚洲红杏|