成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何在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-11 23:43:20

JavaScript數組開發

2021-03-18 10:45:02

JavaScript數組運算符

2018-10-11 09:40:53

前端JavaScript編程語言

2021-11-08 10:58:08

變量依賴圖排序

2015-07-06 09:59:56

JavaScript私有成員

2024-04-11 08:30:05

JavaScript數組函數

2025-02-10 10:29:32

2023-04-26 15:19:36

JavaScripMap數組

2025-01-09 09:14:44

2020-12-08 08:07:41

JavaScript中等分數組

2024-10-22 15:10:49

2022-01-21 10:58:39

JavaScriptGolangPython

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 前端數克隆對象

2021-05-17 14:02:38

Swift 多重排序

2022-03-15 07:55:09

JavaScript線性儀表圖開發

2016-08-03 17:23:47

javascripthtml前端
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精品自拍视频 | 午夜成人在线视频 | 一区二区免费视频 | 精品久久久久久亚洲精品 | 色男人天堂av | 亚洲精品白浆高清久久久久久 | 希岛爱理在线 | 欧美伊人久久久久久久久影院 | 日日日日操 | 精品日韩在线 | 久久久久久影院 | 亚洲在线一区二区三区 | 高清免费av | 久久久性色精品国产免费观看 | 麻豆久久| 亚洲经典一区 | 国产成人精品一区二区三区视频 | 一区二区三区在线 | 久久久久久99 | 欧美伊人久久久久久久久影院 | 日韩视频三区 | 欧美日韩久久久 | 国产精品.xx视频.xxtv | 午夜久久久| 97精品国产97久久久久久免费 | 国产精品永久久久久久久www | 99久久久久久 | 中文字幕高清一区 | 亚洲精品美女视频 | 国内精品成人 | 精品久久久久一区二区国产 | 男女国产视频 | 黄色精品视频网站 | 久久黄色网 | 亚洲一区在线日韩在线深爱 | 亚洲 中文 欧美 日韩 在线观看 | 亚洲黄色网址视频 | 日本免费一区二区三区四区 | 国产精品99久久久久久www | 激情五月婷婷 | 免费看大片bbbb欧美 |