修復 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' ]

更新於: 2020-08-18

199 次檢視

啟動你的 職業生涯

透過完成課程獲得認證

開始學習
廣告
© . All rights reserved.