JS: 數組的迴圈函數

来源:https://www.cnblogs.com/guolao/archive/2019/04/09/10677361.html
-Advertisement-
Play Games

JS 數組相關的迴圈函數,用得挺多,所以有些坑還是要去踩一下,先來看一道面試題。 註意: 下麵提到的不改變原數組僅針對基本數據類型。 面試題 模擬實現數組的 map 函數。 心中有答案了嗎?我的答案放在最後。 map( callback( cur, index, arr ), thisArg ) m ...


JS 數組相關的迴圈函數,用得挺多,所以有些坑還是要去踩一下,先來看一道面試題。

註意:下麵提到的不改變原數組僅針對基本數據類型。

面試題


模擬實現數組的 map 函數。

心中有答案了嗎?我的答案放在最後。

map( callback( cur, index, arr ), thisArg )


map 方法創建一個新數組,其結果是該數組中的每個元素都調用一個提供的函數後返回的結果。

  1. map 不改變原數組(可以在 callback 執行時改變原數組)

    let a = [1, 2, 3]
    let b = a.map(item => item*2)
    
    // 不改變原數組
    a // [1, 2, 3]
    b // [2, 4, 6]
    
    // 在 callback 執行時改變原數組
    a.map((cur, i, arr) => arr[i] *= 2)
    a // [2, 4, 6]
  2. 沒有 return 時,返回undefined

    let c = a.map((cur, i, arr) => arr[i] *= 2)
    
    c // [undefined, undefined, undefined]
  3. 原數組中新增加的元素不會被 callback 訪問

    let a = [1, 2, 3]
    let b = a.map((cur, i, arr) => {
      arr.push(arr.length + 1)
      return cur*2
    })
    
    b // [2, 4, 6]
    a // [1, 2, 3, 4, 5, 6]

filter( callback( cur, index, arr ), thisArg )


filter 方法創建一個新數組, 其包含通過所提供函數實現的測試的所有元素。

這個沒什麼好說的,filter 只返回過濾後的新數組,依然不會改變原數組

let a = [1, 2, 3]
let b = a.filter(item => item % 2 == 0)

a // [1, 2, 3]
b // [2]

需要註意的是,儘量不要在 filter 中直接return item

/* 一般情況是沒問題的 */
let a = [1, 2, 3]
let b = a.filter(item => item)

a // [1, 2, 3]
b // [1, 2, 3]

/* false、0、undefined、null */
let c = [true, false, 0, undefined, null]
let d = c.filter(item => item)

c // [true, false, 0, undefined, null]
d // [true]

一般情況下直接return item是沒問題的,但遇到false、0、undefined、null這幾個特殊值時,就會出問題。因為 filter 是根據return的值來判斷返回的新數組是否要添加遍歷到的原數組索引值,而不是直接在新數組中添加return的值。

簡單來說,就是 filter 中的 callback 的 return 應該返回一個 boolean 值,true 即滿足過濾條件,false 則不滿足過濾條件。

forEach( callback( cur, index, arr ), thisArg )


forEach 方法對數組的每個元素執行一次提供的函數。

  1. forEach 無法中斷,需要中斷的則表明:不應該使用 forEach。當然,使用 try、catch 是可以實現中斷的,但不推薦。

    let a = [1, 2, 3]
    
    try {
      a.forEach(item => {
        console.log(item)
       if (item % 2 == 0) throw new Error('hhh')
      })
    } catch (e) {
      console.log('中斷')
    }
    
    /*
    1
    2
    中斷
    */
  2. forEach 也是不會改變原數組的

    let a = [1, 2, 3]
    a.forEach(item => item*2)
    a // [1, 2, 3]

every( callback( cur, index, arr ), thisArg )


every 方法測試數組的所有元素是否都通過了指定函數的測試。

這個沒什麼好說的,但 every 和 some 都有個坑。

:空數組調用 every 會返回true

// 返回了 true
[].every(item => item > 0) // true

some( callback( cur, index, arr ), thisArg )


some 方法測試是否至少有一個元素通過由提供的函數實現的測試。

:空數組調用 some 會返回false

// 和 every 相反,這裡返回了 false
[].some(item => item > 0) // false

reduce( callback( prev, cur, index, arr ), initVal )


reduce 方法對數組中的每個元素執行一個由您提供的reducer函數(升序執行),將其結果彙總為單個返回值。

  1. 如果沒有提供initVal,reduce 會取數組中的第一個值為prev, 然後從數組索引 1 開始執行 callback,跳過第一個索引。如果提供initlVal,從索引 0 開始,previnitVal

  2. 如果數組為空且沒有提供initVal會報錯。

    [].reduce((prev, cur)=> cur) // TypeError

實現 map 函數


Array.prototype._map = function(callback, thisArg) {
  if (typeof callback !== 'function') {
    throw new TypeError(`${callback} is not a function`)
  }
  
  let res = []
  
  for (let i=0; i<this.length; i++) {
    res.push(callback.call(thisArg, this[i], i, this))
  }
  
  return res
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.demo總結 2.第三方使用 一、demo總結 1.選擇相冊單張照片 二、第三方使用 ...
  • 此方案只能用於開發環境,線上最好設置同源策略(遇到個後端,裝你媽批) 前後端不在同一伺服器的情況下,前端要訪問後端API,可通過在vue.config.js中配置代理伺服器。 0:前提條件 1:安裝vue-lic 2:安裝axios 用於發送請求。 1:將任何未知請求轉發到代理伺服器 如: 前端地址 ...
  • 越學習越感覺自己瞭解的少,學習的知識不夠扎實,以前總是感覺自己瞭解CORS,前後臺交互遇到那個經典的錯誤信息腦海中就會想起需要後臺設置 cors 錯誤和代碼如下。 解決的方案也是隨口說來,也就是在後臺設置上如下類似的代碼, 直到這一次項目..搞得我是真的難受,這一篇文章本來想詳細寫一些 CORS的東 ...
  • 我認為,學習一門語言,主要是掌握它的思想與用途,就好比談戀愛一樣,你只要猜測到了對方的想法,就能夠知情達意。廢話不多說,我們開始今天學習的進度,加油ヾ(◍°∇°◍)ノ゙ 1. jQuery([selector[, context]]) 該函數還可以表示為 $([selector[, context] ...
  • 整體思路: 1.實現頁面佈局,設置css樣式 2.用jQuery獲取需要用到的變數 3.用jQuery為兩個按鈕綁定事件 一.頁面佈局: <style> body{ margin: 0 0 0 0; height: 1000px; width: 100%; } .d1{ position: abso ...
  • 在數組的方法中有一組用於遍曆數組的方法。有 forEach()、map()、filter()、find()、reduce()、some()、every()。 他們的共同特征是: 1. 它們都自帶遍歷(只要調用這個方法就會自動迴圈數組中的每一項) 2. 它們都不會改變原數組,調用方法後產生的結果在返回 ...
  • 使用bootstrap自帶的提示控制項,省去了不少事情 控制器或者js代碼: 控制顏色,類名是生成彈出層後的類名: 預設背景顏色 設置顏色後 ...
  • 主要分享自己日常工作中常用的工具函數,希望能夠對大家有幫助。工具函數不定時持續更新中…… ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...