陣列去重的方式有很多,我們可以使用 Set 去重、filter 過濾等,詳見
攜程&蘑菇街&bilibili:手寫陣列去重、扁平化函式
,但三種解法(Set、filter、reducer)都產生了新陣列:
MDN :
filter()
方法建立一個新陣列, 其包含透過所提供函式實現的測試的所有元素。
那麼我們如何在不產生性陣列的情況下刪除陣列中的重複元素喃?
方式一:排序去重
MDN:
sort()
方法用原地演算法對陣列的元素進行排序,並返回陣列。預設排序順序是在將元素轉換為字串,然後比較它們的UTF-16程式碼單元值序列時構建的
const
removeDuplicates = (nums) => {
// 原地排序
nums。sort()
// 去重
let
len =
1
for
(
let
i =
1
; i < nums。length; i++)
if
(nums[i] != nums[i
-1
]) nums[len++] = nums[i];
// 刪除重複項
nums。splice(len)
return
nums
}
// 測試
removeDuplicates([
1
,
2
,
3
,
1
,
3
])
// [1, 2, 3]
方式二:最佳化
const
removeDuplicates = (nums) => {
let
len = nums。length -
1
for
(
let
i = len; i>=
0
; i——) {
if
(nums。indexOf(nums[i]) != i) {
nums[i] = nums[len ——]
}
}
// 刪除重複項
nums。splice(len+
1
)
return
nums
}
// 測試
removeDuplicates([
1
,
2
,
3
,
1
,
3
])
// [1, 2, 3]