修復 JavaScript 中 .sort() 方法的問題:兩個陣列排序而不是隻有一個
Array.prototype.sort() 函式的一個特性是它是一種就地排序演算法,這意味著它不會建立要排序的陣列的新副本,它在不使用任何額外空間的情況下對陣列進行排序,使其更有效率和效能。但這種特性有時會導致尷尬的情況。
讓我們用一個例子來理解這一點。假設,我們有一個 names 陣列,其中包含一些字串文字。我們希望保持此陣列的順序不變,並希望另一個數組包含與 names 陣列相同的元素,但按字母順序排序。
我們可以這樣做:
const names = ['Rakesh', 'Mukesh', 'Ram', 'Anshul', 'Dheeraj']; let sortedNames = names; sortedNames = sortedNames.sort(); console.log(names); console.log(sortedNames);
但眾所周知,在 JavaScript 中,陣列也是物件,物件是按引用複製而不是按值複製,因此對一個數組進行排序會導致兩個陣列都進行排序,這顯然不是我們想要的。
解決方案
1. 在初始化新陣列時使用 slice()
示例
const names = ['Rakesh', 'Mukesh', 'Ram', 'Anshul', 'Dheeraj']; let sortedNames = names.slice(); sortedNames = sortedNames.sort(); console.log(names); console.log(sortedNames);
slice() 方法實際上返回一個淺複製,將其複製到一個新的陣列中,如果未提供任何引數,則從開始複製到結束。
雖然此方法效率不高,因為它包括初始化一個新陣列,並且僅對字串/數字文字陣列有效,但第二種方法效率更高,並且也適用於物件陣列。
2. 使用 JSON.stringify() / JSON.parse()
示例
const names = ['Rakesh', 'Mukesh', 'Ram', 'Anshul', 'Dheeraj']; let sortedNames = JSON.parse(JSON.stringify(names)); sortedNames = sortedNames.sort(); console.log(names); console.log(sortedNames);
將陣列轉換為 JSON 字串,然後轉換回陣列,這使得編譯器不會按引用複製。
兩種方法的輸出在控制檯中將相同:
輸出
[ 'Rakesh', 'Mukesh', 'Ram', 'Anshul', 'Dheeraj' ] [ 'Anshul', 'Dheeraj', 'Mukesh', 'Rakesh', 'Ram' ]
廣告
資料結構
網路
關係型資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP