JavaScript 數組過濾方法

在 JavaScript 編程中,數組是最常用的數據結構之一,而數組過濾則是處理數據集合的關鍵操作。filter() 方法提供了一種高效的方式來從數組中篩選出符合特定條件的元素,返回一個新的數組,而不改變原始數組。這種方法在處理對象數組時尤其有用,能夠幫助開發者快速實現數據查詢和篩選功能。

filter() 方法基礎

語法和工作原理

filter() 方法接受一個測試函數作為參數,該函數會對數組中的每個元素進行測試。如果元素通過測試(即函數返回 true),則該元素會被包含在新數組中;否則被排除。

var newArray = arr.filter(callback(element[, index[, array]])[, thisArg])
  • callback: 測試函數,接收三個參數:
    • element: 當前處理的元素
    • index (可選): 當前元素的索引
    • array (可選): 調用 filter 的數組本身
  • thisArg (可選): 執行 callback 時使用的 this 值

基本數值數組過濾示例

// 定義一個包含數字的數組
var numbers = [5, 32, 43, 4];// 使用傳統函數語法過濾奇數
var odd = numbers.filter(function(n) {return n % 2 !== 0; // 檢查數字是否為奇數
});// 使用箭頭函數簡化語法
let odd = numbers.filter(n => n % 2 !== 0); 
// 可以進一步簡化為: (n => n % 2),因為非零數字在布爾上下文中為 true// 結果: odd 包含 [5, 43]

對象數組的過濾

JavaScript 的 filter() 方法同樣適用于對象數組,這使得它成為處理復雜數據集的強大工具。

基本對象過濾示例

// 定義人員對象數組
var people = [{id: 1,name: "John",age: 28
}, {id: 2,name: "Jane",age: 31
}, {id: 3,name: "Peter",age: 55
}];// 使用傳統函數語法過濾年齡小于35歲的人
var young = people.filter(function(person) {return person.age < 35; // 年齡條件測試
});// 使用箭頭函數簡化語法
let young = people.filter(person => person.age < 35);// 結果: young 包含前兩個對象
/*
[{id: 1,name: "John",age: 28
}, {id: 2,name: "Jane",age: 31
}]
*/

高級對象屬性搜索

有時候我們需要在整個對象中搜索特定值,而不僅僅是某個特定屬性:

// 搜索包含字母"J"的任何屬性值
var young = people.filter((obj) => {var flag = false; // 標志變量,用于標記是否找到匹配Object.values(obj).forEach((val) => { // 遍歷對象的所有值if(String(val).indexOf("J") > -1) { // 將值轉換為字符串并檢查是否包含"J"flag = true; // 找到匹配,設置標志return; // 提前退出循環}    });if(flag) return obj; // 如果找到匹配,返回當前對象
});// 結果: 返回包含"J"的對象
/*
[{id: 1,name: "John",age: 28
},{id: 2,name: "Jane",age: 31
}]
*/

filter() 方法的高級應用

多條件過濾

// 多條件過濾:年齡小于35且名字包含"J"
var filteredPeople = people.filter(person => {return person.age < 35 && person.name.includes("J");
});

鏈式調用多個數組方法

// 先過濾再映射提取特定屬性
var names = people.filter(person => person.age < 35).map(person => person.name);// 結果: ["John", "Jane"]

性能考慮和最佳實踐

  1. 避免在 filter 中修改原始數組:filter() 方法本身不會改變原數組,但回調函數中的操作可能會。
  2. 復雜操作提前終止:對于大型數組,如果可能,在找到所需元素后提前終止循環。
  3. 考慮使用索引:如果處理大型數組,可以使用回調函數的 index 參數進行性能優化。

filter() 與其他數組方法對比

flowchart TDA[原始數組] --> B[filter<br>條件篩選]A --> C[map<br>轉換元素]A --> D[reduce<br>累積計算]B --> E[新數組:<br>符合條件的元素]C --> F[新數組:<br>轉換后的元素]D --> G[單一結果:<br>累積值]

實際應用場景

場景一:電子商務產品過濾

const products = [{ id: 1, name: "筆記本電腦", price: 4500, category: "電子" },{ id: 2, name: "襯衫", price: 120, category: "服裝" },{ id: 3, name: "智能手機", price: 2800, category: "電子" }
];// 過濾電子類產品且價格低于3000元的商品
const affordableElectronics = products.filter(product => product.category === "電子" && product.price < 3000
);// 結果: 智能手機

場景二:用戶權限管理

const users = [{ id: 1, name: "管理員", role: "admin", active: true },{ id: 2, name: "編輯", role: "editor", active: true },{ id: 3, name: "訪客", role: "guest", active: false }
];// 獲取所有活躍的非管理員用戶
const activeNonAdminUsers = users.filter(user => user.active && user.role !== "admin"
);

兼容性和替代方案

filter() 方法在 ECMAScript 5 (ES5) 中引入,所有現代瀏覽器都支持。對于需要支持老舊瀏覽器的項目,可以考慮使用 polyfill 或者類似的庫函數(如 Lodash 的 _.filter)。

總結

JavaScript 的 filter() 方法是處理數組數據的強大工具,特別適合從大型數據集中提取符合特定條件的子集。通過掌握其基本用法和高級技巧,開發者可以編寫出更簡潔、高效和可維護的代碼。無論是簡單的數值數組還是復雜的對象數組,filter() 方法都能提供優雅的解決方案。


單詞、短語表

單詞(短語)音標詞性詞根/詞綴釋義搭配例子
Filtering/?f?lt?r??/名詞/動詞filter(過濾) + -ing(動名詞后綴)過濾data filtering, filtering methodData filtering is essential for processing large datasets.
Arrays/??re?z/名詞array(數組) + -s(復數)數組JavaScript arrays, multidimensional arraysJavaScript arrays can hold multiple values in a single variable.
Entity/?ent?ti/名詞來自拉丁語 ens(存在)實體, 存在物business entity, legal entityEach database table represents an entity in the system.
Framework/?fre?mw??rk/名詞frame(框架) + work(工作)框架development framework, .NET frameworkEntity Framework is a popular ORM framework for .NET.
Extensions/?k?sten??nz/名詞extend(擴展) + -sion(名詞后綴) + -s(復數)擴展, 擴展功能browser extensions, framework extensionsThese extensions enhance the functionality of the base framework.
Bulk/b?lk/名詞/形容詞來自古北歐語 bulki(貨物)批量, 大量bulk operations, bulk dataBulk operations improve performance when handling large datasets.
Merge/m??rd?/動詞來自拉丁語 mergere(浸入)合并, 融合merge conflicts, data mergeThe bulk merge operation combines insert and update operations.
Contains/k?n?te?nz/動詞con-(一起) + tain(持有) + -s(第三人稱單數)包含, 含有array contains, contains methodThe new array contains only the elements that passed the test.
.

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/98970.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/98970.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/98970.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《sklearn機器學習——數據預處理》離散化

sklearn 數據預處理中的離散化&#xff08;Discretization&#xff09; 離散化是將連續型數值特征轉換為離散區間&#xff08;分箱/bins&#xff09;的過程&#xff0c;常用于簡化模型、增強魯棒性、處理非線性關系或滿足某些算法對離散輸入的要求&#xff08;如樸素貝葉斯、決…

PTA算法簡析

ArkAnalyzer源碼初步分析I&#xff1a;https://blog.csdn.net/2302_80118884/article/details/151627341?spm1001.2014.3001.5501 首先&#xff0c;我們必須明確 PTA 的核心工作&#xff1a;它不再關心變量的“聲明類型”&#xff0c;而是為程序中的每一個變量和每一個對象字段…

Vue 3 中監聽多個數據變化的幾種方法

1. 使用 watch監聽多個 ref/reactive 數據import { ref, watch } from vueexport default {setup() {const count ref(0)const name ref()const user reactive({ age: 20 })// 監聽多個數據源watch([count, name, () > user.age], // 數組形式傳入多個數據源([newCount, …

第 2 篇:Java 入門實戰(JDK8 版)—— 編寫第一個 Java 程序,理解基礎運行邏輯

用 IntelliJ IDEA 寫第一個 Java 8 程序&#xff1a;Hello World 實操指南 作為 Java 初學者&#xff0c;“Hello World” 是你接觸這門語言的第一個里程碑。本文會聚焦 Java 8&#xff08;經典 LTS 版本&#xff0c;企業級開發常用&#xff09; 和 IntelliJ IDEA&#xff08;當…

【GPT入門】第67課 多模態模型實踐: 本地部署文生視頻模型和圖片推理模型

【GPT入門】第67課 多模態模型實踐&#xff1a; 本地部署文生視頻模型和圖片推理模型1. 文生視頻模型CogVideoX-5b 本地部署1.1 模型介紹1.2 環境安裝1.3 模型下載1.4 測試2.ollama部署圖片推理模型 llama3.2-vision2.1 模型介紹2.2 安裝ollama2.3 下載模型2.4 測試模型2.5 測試…

C++初階(6)類和對象(下)

1. 再談構造函數&#xff08;構造函數的2個深入使用技巧&#xff09; 1.1 構造函數體賦值 在創建對象時&#xff0c;編譯器通過調用構造函數&#xff0c;給對象中各個成員變量一個合適的初始值。 雖然上述構造函數調用之后&#xff0c;對象中已經有了一個初始值&#xff0c;…

容器文件描述符熱遷移在云服務器高可用架構的實施標準

在云計算環境中&#xff0c;容器文件描述符熱遷移技術正成為保障業務連續性的關鍵解決方案。本文將深入解析該技術在云服務器高可用架構中的實施標準&#xff0c;涵蓋技術原理、實現路徑、性能優化等核心維度&#xff0c;為構建穩定可靠的容器化基礎設施提供系統化指導。 容器文…

毫米波雷達液位計如何遠程監控水位?

引言毫米波雷達液位計作為一種高精度、非接觸式的水位監測設備&#xff0c;正逐漸成為智慧水務、環境監測等領域的關鍵工具。其通過先進的調頻連續波&#xff08;FMCW&#xff09;技術&#xff0c;實現5mm的測量精度&#xff0c;并支持多種遠程通信方式&#xff0c;使用戶能夠實…

關于 C++ 編程語言常見問題及技術要點的說明

關于 C 編程語言常見問題及技術要點的說明C 作為一門兼具高效性與靈活性的靜態編譯型編程語言&#xff0c;自 1985 年正式發布以來&#xff0c;始終在系統開發、游戲引擎、嵌入式設備、高性能計算等領域占據核心地位。隨著 C 標準&#xff08;如 C11、C17、C20&#xff09;的持…

【Qt QSS樣式設置】

Qt中的QSS樣式設置流程 Qt Style Sheets (QSS) 是Qt框架中用于自定義控件外觀的樣式表語言&#xff0c;其語法類似于CSS。以下是QSS的設置流程和示例。 QSS設置流程 1. 創建QSS樣式表文件或字符串 首先&#xff0c;需要創建QSS樣式表&#xff0c;可以是一個單獨的.qss文件&…

使用 Apollo TransformWrapper 生成相機到各坐標系的變換矩陣

使用 Apollo TransformWrapper 生成相機到各坐標系的變換矩陣一、背景二、原理1、什么是變換矩陣&#xff1f;2、為什么需要變換矩陣&#xff1f;3、Apollo 中的坐標系4、Apollo TransformWrapper三、操作步驟1. 設置車輛參數2. 啟動靜態變換發布3. 查看變換信息4. 播放記錄數據…

硬件(十)IMX6ULL 中斷與時鐘配置

一、OCP 原則&#xff08;開閉原則&#xff09;對代碼擴展是開放的&#xff0c;允許通過新增代碼來擴展功能&#xff1b;對代碼的修改是關閉的&#xff0c;盡量避免直接修改已有穩定運行的代碼&#xff0c;以此保障代碼的穩定性與可維護性。二、中斷處理&#xff08;一&#xf…

打工人日報#20250913

打工人日報#20250913 周六&#xff0c;回杭州了&#xff0c;這邊居然下雨。 閱讀 《小米創業思考》 第七章 技術為本 其中的技術介紹算是比較詳細的&#xff0c;架構也很清晰&#xff0c;有一種對自己家產品如數家珍的感覺&#xff0c;對于架構也是經常思考的感覺感恩 和namwei…

【面試題】RAG核心痛點

1. 文檔切分粒度不好把控&#xff0c;既擔心噪聲太多又擔心語義信息丟失 這是一個經典難題。切分粒度過大&#xff0c;單個chunk包含過多無關信息&#xff08;噪聲&#xff09;&#xff0c;會干擾LLM理解核心內容&#xff1b;切分過小&#xff0c;則可能割裂句子或段落的完整語…

網絡安全與iptables防火墻配置

iptables基本概念iptables是Linux系統中強大的防火墻工具&#xff0c;它工作在用戶空間&#xff0c;通過命令行界面與內核空間的netfilter框架交互&#xff0c;實現數據包過濾、網絡地址轉換(NAT)等功能。Web服務器防火墻配置實例以下是針對Web服務器的iptables配置步驟&#x…

qt中給QListWidget添加上下文菜單(快捷菜單)

步驟 添加customContextMenuRequested信號的槽函數&#xff0c;添加后&#xff0c;在QListWidget上單擊右鍵&#xff0c;無法響應&#xff0c;還必須執行下面操作&#xff1b;設置QListWidget上下文菜單策略為Qt::CustomContextMenu 如下&#xff1a;

一款好看的jQuery前端框架-HisUI

HisUI&#xff1a;一款基于EasyUI的前端組件類庫&#xff0c;讓web開發更迅速、簡單。 HisUI官網文檔

【Docker】P3 入門指南:運維與開發雙重視角

目錄Docker入門&#xff1a;運維與開發運維視角Docker 架構概述Docker 鏡像鏡像概念理解查看和管理鏡像拉取鏡像鏡像標識容器管理啟動容器容器內操作容器的后臺運行多容器管理重新進入運行中的容器容器生命周期管理開發視角容器化思維示例&#xff1a;基于 Nginx 鏡像構建簡單 …

第六屆大數據、人工智能與物聯網工程國際會議(ICBAIE 2025)

重要信息 時間&#xff1a;2025年10月17-19日 地點&#xff1a;中國上海 官網&#xff1a;www.icbaie.net 征稿主題 1. 大數據與云計算 2. 人工智能技術與應用 3. 機器人科學與工程 4. 物聯網與傳感器技術 5. 其他 大數據、人工智能與物聯網 引言 在數字化轉型的時代…

Docker存儲卷(Volume)核心概念、類型與操作指南

文章目錄一、存儲卷概念二、存儲卷分類2.1 管理卷2.2 綁定數據卷2.3 臨時數據卷三、MySQL災難恢復四、存儲卷的局限性一、存儲卷概念 什么是存儲卷&#xff1f; ??Docker 存儲卷 是 Docker 容器中用于持久化存儲數據的獨立文件系統區域。它獨立于容器的聯合文件系統&#xf…