javascript字典中添加數組_如何在 JavaScript 中更好地使用數組

1602b7d8fa70f1b6c779b47caba6d136.png

在 freeCodeCamp 社區閱讀原文。

本文短小精悍,我保證。在過去的數個月里,我注意到在我審閱的 pull request 中有四個(關于數組使用的)錯誤經常出現。同時,我自己也會犯這些錯誤,因此有了這篇文章。讓我們一起學習,以確保以后能正確地使用數組方法!

使用Array.includes替代 Array.indexOf

“如果需要在數組中查找某個元素,請使用 Array.indexOf 。”

我記得在我學習 JavaScript 的課程中有類似的這么一句話。毫無疑問,這完全正確!

在 MDN 文檔中,對 Array.indexOf 的描述是:返回在數組中可以找到一個給定元素的第一個索引,如果不存在,則返回-1。因此,如果在之后的代碼中需要用到(給給定元素的)索引,那么 Array.indexOf 是不二之選。

然而,如果我們僅需要知道數組中是否包含給定元素呢?這意味著只是是與否的區別,這是一個布爾問題(boolean question)。針對這種情況,我建議使用直接返回布爾值的 Array.includes

'use strict';const characters = ['ironman','black_widow','hulk','captain_america','hulk','thor',
];console.log(characters.indexOf('hulk'));
// 2
console.log(characters.indexOf('batman'));
// -1console.log(characters.includes('hulk'));
// true
console.log(characters.includes('batman'));
// false

使用 Array.find 替代 Array.filter

Array.filter 是一個十分有用的方法。它通過回調函數過濾原數組,并將過濾后的項作為新數組返回。正如它的名字所示,我們將這個方法用于過濾,(一般而言)會獲得一個長度更短的新數組。

然而,如果知道經回調函數過濾后,只會剩余唯一的一項,那么我不建議使用 Array.filter 。比如:使用等于某個唯一 ID 為過濾條件去過濾一個數組。在這個例子中, Array.filter 返回一個僅有一項的新數組。然而,我們僅僅是為了獲取 ID 為特定 ID 的那一項,這個新數組顯得毫無用處。

讓我們討論一下性能。為了獲取所有符合回調函數過濾條件的項, Array.filter 必須遍歷整個數組。如果原數組中有成千上萬項,回調函數需要執行的次數是相當多的。

為避免這些情況,我建議使用 Array.find 。它與 Array.filter 一樣需要一個回調函數,(但只是返回)符合條件的第一項。當找到符合回調函數過濾條件的第一個元素時,它會立即停止往下的搜尋。不再遍歷整個數組。

'use strict';const characters = [{ id: 1, name: 'ironman' },{ id: 2, name: 'black_widow' },{ id: 3, name: 'captain_america' },{ id: 4, name: 'captain_america' },
];function getCharacter(name) {return character => character.name === name;
}console.log(characters.filter(getCharacter('captain_america')));
// [
//   { id: 3, name: 'captain_america' },
//   { id: 4, name: 'captain_america' },
// ]console.log(characters.find(getCharacter('captain_america')));
// { id: 3, name: 'captain_america' }

使用 Array.some替代 Array.find

我承認我經常犯這個錯誤。之后,一位朋友建議我去查看 MDN 文檔以尋找更好的方法。事實上(這錯誤)與上面 Array.indexOf / Array.includes 的例子十分相像。

在上面的例子中,我們知道 Array.find 需要一個回調函數作為參數,并返回(符合條件的)第一個元素。然而,當我們需要知道數組中是否存在一個元素時, Array.find 是最好的選擇嗎?不一定是,因為它返回一個元素,而不是一個布爾值。

在下面的例子中,我建議使用 Array.some ,它返回你需要的布爾值。

'use strict';const characters = [{ id: 1, name: 'ironman', env: 'marvel' },{ id: 2, name: 'black_widow', env: 'marvel' },{ id: 3, name: 'wonder_woman', env: 'dc_comics' },
];function hasCharacterFrom(env) {return character => character.env === env;
}console.log(characters.find(hasCharacterFrom('marvel')));
// { id: 1, name: 'ironman', env: 'marvel' }console.log(characters.some(hasCharacterFrom('marvel')));
// true

譯者注:補充一下 Array.someArray.includes 使用上的區別。兩者都返回一個布爾值,表示某項是否存在于數組之中,一旦找到對應的項,立即停止遍歷數組。不同的是 Array.some 的參數是回調函數,而 Array.includes 的參數是一個值(均不考慮第二個可選參數)。

假設希望知道值為 value 的項是否存在于數組中,既可以編寫代碼: [].includes(value) , 也可以給 Array.some 傳入 item => item === value 作為回調函數。 Array.includes 使用更簡單, Array.some 可操控性更強。

使用Array.reduce替代Array.filter與Array.map的組合

事實上說, Array.reduce 不太容易理解。然而,如果我們先使用 Array.filter 過濾原數組,之后(對結果)再調用 Array.map (以獲取一個新數組)。這看起似乎有點問題,是我們忽略了什么嗎?

這樣做的問題是:我們遍歷了兩次數組。第一次是過濾原數組以獲取一個長度稍短的新數組,第二次遍歷(譯者注:指 Array.map )是對 Array.filter 的返回的新數組進行加工,再次創造了一個新數組!為得到最終的結果,我們結合使用了兩個數組方法。每個方法都有它自己的回調函數,而且供 Array.map 使用的臨時數組是由 Array.filter 提供的,(一般而言)該數組無法復用。

為避免如此低效場景的出現,我的建議是使用 Array.reduce 。一樣的結果,更好的代碼! Array.reduce 允許你將過濾后切加工過的項放進累加器中。累加器可以是需要待遞增的數字、待填充的對象、 待拼接的字符串或數組等。

在上面的例子中,我們使用了 Array.map ,(但更)建議使用累加器為待拼接數組的 Array.reduce 。在下面的例子中,根據變量 env 的值,我們會將它加進累加器中或保持累加器不變(即不作任何處理)。

'use strict';const characters = [{ name: 'ironman', env: 'marvel' },{ name: 'black_widow', env: 'marvel' },{ name: 'wonder_woman', env: 'dc_comics' },
];console.log(characters.filter(character => character.env === 'marvel').map(character => Object.assign({}, character, { alsoSeenIn: ['Avengers'] }))
);
// [
//   { name: 'ironman', env: 'marvel', alsoSeenIn: ['Avengers'] },
//   { name: 'black_widow', env: 'marvel', alsoSeenIn: ['Avengers'] }
// ]console.log(characters.reduce((acc, character) => {return character.env === 'marvel'? acc.concat(Object.assign({}, character, { alsoSeenIn: ['Avengers'] })): acc;}, [])
)
// [
//   { name: 'ironman', env: 'marvel', alsoSeenIn: ['Avengers'] },
//   { name: 'black_widow', env: 'marvel', alsoSeenIn: ['Avengers'] }
// ]

這就是本文的全部內容!

希望這對你有幫助。如果你對本文有任何意見或(關于數組方法使用的)例子需要討論,請在評論中告訴我。如果你覺得本文不錯,請給我點贊并分享給更多的小伙伴。感謝你的閱讀!

注意:請在使用 Array.findArray.includes 前檢查瀏覽器是否支持相關方法,上述兩個方法在 Internet Explorer 上并不支持(譯者注:可以使用 Polyfill)。

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

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

相關文章

mysql join圖解_MySQL中Join算法實現原理分析[多圖]

在MySQL 中,只有一種 Join 算法,就是大名鼎鼎的 Nested Loop Join,他沒有其他很多數據庫所提供的 Hash Join,也沒有 Sort Merge Join。顧名思義,Nested Loop Join 實際上就是通過驅動表的結果集作為循環基礎數據&#…

mysql多線程使用一個鏈接_探索多線程使用同一個數據庫connection的后果

在項目中看到有用到數據庫的連接池,心里就思考著為什么需要數據庫連接池,只用一個連接會造成什么影響?(只用一個connection)?1 猜想:jdbc的事務是基于connection的,如果多線程共用一個connection,會造成多線程之間的事務相互干…

vs中四點畫矩形的算法_中考熱點,初高中銜接之倒角利器四點共圓

初中數學課程標準修改后,教材中四點共圓知識已經刪除掉了,但這樣一件強悍且使用簡單的武器,我們還是有必要去了解的,近年來對于壓軸題以幾何為核心的考區來說,有時用到解題更為簡潔方便,由此應該理解掌握。…

phpnow mysql字符集_使用PHPnow搭建本地PHP環境+創建MySQL數據庫

要想學習WordPress建站,在本地搭建PHP環境是十分必要的,在以后的建站日子里,你可以使用這個環境來進行wordpress的程序學習、調試等工作,等你熟悉了wordpress以后,再購買域名和空間,真正開始你的建站之旅。…

用python慶祝生日_python, 實現朋友家人年歷生日自動提醒

為了方便提醒自己,今天有哪位朋友過生日(年歷生日)。測試環境:fedora25桌面版。建立一個生日配置文件,注意:按日期排好序vi /etc/birthday.txt朋友A 1-4朋友C 2-3朋友B 3-8創建腳本文件創建腳本文件 /usr/bin/check_birthday&…

wps如何保存最終狀態_如何使得打開word文件顯示最終的修改狀態

展開全部 在日常工作中,經常為了保護文檔而將其設置成最e68a84e8a2ad3231313335323631343130323136353331333363376366終狀態,設置文檔為最終狀態,則是表示已完成這篇文檔的編輯,這是文檔的最終版本。如果文檔被標記為最終狀態,則狀態屬性將設置為“最終狀態”,并且將禁用…

python整數反轉_敲代碼學Python:力扣簡單算法之整數反轉

學習重點:整數逆序算法力扣(LeetCode)原題?leetcode-cn.com 功能:整數反轉 來源:https://leetcode-cn.com/explore/featured/card/top-interview-questions-easy/5/strings/33/ 重點:整數逆序算法 作者&am…

前端累加nan怎么解決_前端面試,你有必要知道的一些JavaScript 面試題(上)

1.使用 typeof bar “object” 判斷 bar 是不是一個對象有神馬潛在的弊端?如何避免這種弊端?使用 typeof 的弊端是顯而易見的(這種弊端同使用 instanceof):let obj {};let arr [];console.log(typeof obj object); //trueconsole.log(typ…

tidb 配置mysql數據源_安裝tidb數據庫

1.下載壓縮包安裝tar包路徑命令:wget http://download.pingcap.org/tidb-latest-linux-amd64.tar.gz命令:wget http://download.pingcap.org/tidb-latest-linux-amd64.sha2562.檢查文件完整性命令:sha256sum -c tidb-latest-linux-amd64.sha2…

linuxos或sv獨立客戶端不支持應用程序打開方式_搞不明白為什么大家都在學習 k8s

作者 | 小明菜市場來源 | 小明菜市場(ID:fileGeek)頭圖 | CSDN 下載自東方IC前言都2020年了,你還不知道kubernetes就真的真的真的out啦。(販賣焦慮體) 什么是k8s,k8s這個詞來自于希臘語,有主管,舵手,船長的…

mysql實現程序的動態鏈接_程序的鏈接和裝入及Linux下動態鏈接的實現

鏈接器和裝入器的基本工作原理一個程序要想在內存中運行,除了編譯之外還要經過鏈接和裝入這兩個步驟。從程序員的角度來看,引入這兩個步驟帶來的好處就是可以直接在程序中使用printf和errno這種有意義的函數名和變量名,而不用明確指明printf和…

python 二進制流_Python中對字節流/二進制流的操作:struct模塊簡易使用教程

前言前段時間使用Python解析IDX文件格式的MNIST數據集,需要對二進制文件進行讀取操作,其中我使用的是struct模塊。查了網上挺多教程都寫的挺好的,不過對新手不是很友好,所以我重新整理了一些筆記以供快速上手。注:教程…

react 圖片放在src里面還是public_手寫Webpack從0編譯Vue/React項目

當前前端開發,90%的項目都是Vue和React,然而70%的同學都基于腳手架創建項目,因為腳手架會包含項目基本框架、webpack配置、scss/sass/less解析、babel配置、DevServer、JSX/Vue文件解析、CSS前綴等,我們要做的就是開發功能模塊&am…

python union函數_如何掌握Python union()方法及怎么用?

不斷學習python的過程里,總能遇到各種形形色色的函數或者方法,本章給大家帶來python union的用法,具體內容如下:union()方法描述:union() 取并集,效果等同于 | ,重復元素只會出現一次&#xff0…

輸入分鐘輸出小時python_輸出鍵,值對如何使1小時內的時間在使用Python的MapReduce中的reducer中結束?...

這是一個策略:來自Mapper的:發出每個記錄的三個副本并使用二級排序:((復合鍵),值)((消息小時 - 一小時,當前消息的精確時間),消息)((消息小時,消息的準確時間),消息)((消息小時1小時…

python 在線預覽文件_用Python PyQt寫一個在線預覽圖片的GUI

在爬完網上一篇帖子,并得到其中的所有圖片鏈接后,寫一個GUI來實現在線預覽是一個很自然的想法, 相當于實現一個python版的圖片瀏覽器, 通過這個練習,可以讓我們更熟悉PyQt這個庫。這里我用的是PyQt4。以下是我的寫的程…

python怎樣安裝模塊_python中如何安裝模塊

下面介紹幾種安裝Python模塊的幾種方式方法1:easy_install 方式先下載ez_setup.py,運行python ez_setup 進行easy_install工具的安裝,之后就可以使用easy_install進行安裝package了。本文安裝的是Python 2.7.13版本,已經自帶了easy_install。…

java rt_java中rt包中源碼了解

javap –verbose class名 查看class文件的具體內容javap -c class名繼續看io類接口 java.io.Closeable功能:關閉流和相應的資源java.io.console功能:使用字節控制臺,與當前的java virtual machine 相關java.io.DataInput功能:從二…

google 確定某點海拔高_一份“高投資回報率”的用戶體驗度量方法指南

本文核心就是介紹體驗度量方法,以及如何在商業項目中如何發起一個具有高ROI(投資回報率)的用戶體驗量化流程。 下面文章將分為解讀高投資回報和拆解體驗度量、實際案例講解三部分。一、解讀高投資回報率高ROI(投資回報率)來定義體驗度量流程的原因?3-5年…

md5 java代碼_JAVA簡單實現MD5注冊登錄加密實例代碼

開發環境:jdk1.7,eclipse框架:springmvc,mybatis工具:maven以下代碼復制即可實現MD5加密創建一個mave項目,加web。不懂得可以搜索一下就有了。注冊用戶的JSP頁面代碼如下。pageEncoding"utf-8"%&…