Array.prototype.filter Implementation
Implement a Custom Array Filter Method
Implement Array.prototype.filter
難度:Easy
題目描述
實作一個Array.prototype.filter
方法,該方法會建立一個新的陣列,其中包含所有通過指定函數測試的元素。為了避免覆蓋原生的 Array.prototype.filter
方法,我們將實作命名為 Array.prototype.myFilter
。核心要求
- 功能完整性
- 必須與原生
filter
方法行為一致 - 需處理稀疏陣列(例如
[1, 2, , 4]
) - 空值應被忽略,不出現在結果陣列中
- 必須與原生
- 參數處理
callbackFn
必須接收三個參數:元素值、索引和原陣列- 正確處理
thisArg
參數
使用範例
Array
Prototype
TypeScript
解題思路
1. 理解 filter 方法的核心功能
filter
是陣列處理的基本工具,主要功能包括:
- 篩選:保留符合條件的元素
- 不可變:不修改原陣列,返回新陣列
- 函數式:使用回調函數決定元素去留
特殊處理要點
- 稀疏陣列:跳過空值位置
- 參數傳遞:提供元素值、索引和原陣列
- this 綁定:支援自定義回調函數中的
this
值
返回值特點
- 只包含通過測試的元素
- 保持原始順序
- 長度 ≤ 原陣列長度
2. 實作方案
此實作符合 ECMAScript 規範,與原生 filter
方法行為一致。
3. 關鍵實作細節
參數檢查
- 確保回調是函數
- 與原生 filter 錯誤處理一致
稀疏陣列處理
- 使用
Object.hasOwn
檢查索引存在性 - 跳過未設置的元素位置
this 綁定
- 使用
call
方法控制this
值 - 按順序傳遞元素值、索引和原陣列
4. callbackFn.call 參數解析
callbackFn.call(thisArg, kValue, k, array)
中的參數各有用途:
thisArg(第一個參數)
控制回調函數內的 this
指向:
kValue(第二個參數)
當前處理的元素值:
- 作為回調的第一個參數
- 最常用的參數
k(第三個參數)
當前元素的索引:
this(第四個參數)
原始陣列的引用:
參數順序設計考量:
- 使用頻率:常用參數在前
- 一致性:與其他陣列方法保持一致
- 功能性:支援不同程度的上下文訪問
進階技巧
1. 效能優化
處理大型陣列時的優化版本:
優化重點:
- 直接索引賦值代替
push
- 使用
k in array
檢查稀疏陣列 - 單一變數追蹤結果陣列長度
2. 實用場景
資料篩選
多條件搜尋
3. 測試要點
總結
實作 filter
方法的關鍵點:
- 核心原則
- 不修改原陣列
- 正確處理稀疏陣列
- 準確綁定
this
值
- 應用場景
- 資料篩選與搜尋
- UI 元素過濾
- API 響應處理