使用數組方法替換 for 循環的示例(以及擴展 forEach() 方法)。數組
使用 map() 修改數據函數
若是咱們想對數組中的每一項執行操做並生成包含結果項的新數組,那麼 map()是一個很好的選擇。map() 方法可用於任何數組,並具備三個參數 - 數組中的當前項,索引(可選)和原始數組(可選)。在回調函數中,咱們能夠返回咱們想要組成 map() 函數返回的新數組的任何值。工具
const newArray = myArray.map((current, index, array) => { // return item for newArray })
讓咱們如下面的文章數組爲例,每一個文章都有一個 title 和 rating 屬性:測試
const articles = [ { title: '你可能不須要循環', rating: 4 }, ... ];
假設咱們想要建立一個新數組,每篇文章都被評爲5星。咱們可使用一個基本for 循環來作到這一點,它看起來像這樣:code
const amazingArticles = []; for (let i = 0; i < articles.length; i++) { const newArticle = Object.assign(articles[i], {rating: 5}); amazingArticles.push(newArticle); }
雖然這會產生咱們想要的結果,可是經過使用該 .map() 方法能夠更好地實現此邏輯 。索引
const amazingArticles = articles.map((article) => { return Object.assign(article, {rating: 5}); });
使用 filter() 過濾數據回調函數
有時,咱們想肯定數組中的項目是否知足特定條件。咱們能夠用 filter() 方法作到這點。filter() 方法和 map() 相似,共有三個參數 - 數組中的當前項,索引(可選)和原始數組(可選)。與map() 不一樣的是,filter() 返回的是一個布爾值,它決定是否將該項保留在返回的新數組中。it
const newArray = myArray.filter((current, index, array) => { // return true or false });
讓咱們之前面的文章數組爲例。若是咱們想得到數組中評級爲3及以上的全部文章怎麼辦?一樣,咱們可使用 for 循環來完成此操做,但 filter() 方法更合適。變量
const highlyRatedArticles = articles.filter((article) => { return article.rating >= 3; });
用 every() 和 some() 進行條件測試擴展
經過 filter() 方法,咱們能夠肯定數組中的哪些項知足特定條件。但有時,咱們不須要知道哪些項知足或不知足條件,咱們可能只須要知道全部或任何項是否知足條件。這是 every() 和 some() 方法發揮做用的地方。every() 和 some() 的方法運做很是類似 filter() 的方法。它們具備相同的參數,而且它們的回調函數須要返回一個布爾值來肯定該項是否知足條件。
const every = myArray.every((current, index, array) => { // return true or false }); const some = myArray.some((current, index, array) => { // return true or false });
這些方法之間的關鍵區別在於 filter() 方法自己返回的內容,即在上面的示例中, every 和 some 變量的值是真假值 。every() 方法返回 true 的條件是數組中的 每一個項 均知足所述條件。若是有一個項目不知足條件,它將返回 false 。另外一方面,some()返回 true 的條件是若是數組中 至少一個 項知足條件。
是否使用 for 循環
正如我前面提到的,循環是不少狀況下都適合的一個很好的工具,而且這些新方法的存在並不意味着根本不該該使用循環。我認爲這些方法很棒,當咱們使用 filter() 方法而不是 for 循環時,乍看之下更容易理解邏輯的目的是什麼。可是,這些方法具備很是嚴格的限制,若是不使用它們的所有值,則可能會過分使用。這方面的一個例子是 map() 方法,它在理論上可用於替換幾乎任何循環。若是在咱們的第一個例子中,咱們只想修改原始 articles 數組而不是建立一個新的修改過的 amazingArticles ,使用這種方法就不必了。使用適合自身狀況的方法很是重要,以確保咱們不會過分使用。