記錄--前端實習生的這個 bug 被用做了一道基礎面試題

来源:https://www.cnblogs.com/smileZAZ/archive/2023/12/04/17875690.html
-Advertisement-
Play Games

這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 前言 測試發現了一個問題,簡單描述問題就是通過函數刪除一個數組中多個元素,傳入的參數是一個數組索引。 然後發現實際效果有時刪除的不是想要的內容。 具體 Bug 代碼實現: const arr = [1,2,3,4,5,6,7]; cons ...


這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助

前言

測試發現了一個問題,簡單描述問題就是通過函數刪除一個數組中多個元素,傳入的參數是一個數組索引。

然後發現實際效果有時刪除的不是想要的內容。

具體 Bug 代碼實現:

const arr = [1,2,3,4,5,6,7];
const removeData = (rowIndex:Array<number>)=>{
    if(Array.isArray(rowIndex)){
        rowIndex.forEach((index)=>{
            arr.splice(index,1)
        })
    }
}
removeData([1,4]); 
console.log(arr); // 輸出結果 [1,3,4,5,7]
// 期望輸出結果 [1,3,4,6,7]

上面代碼出現問題的原因是 splice 會改變原始數組的,然後導致索引偏移,不知道有沒有同學出過類似問題。

因為這個 bug 我發現有些同學基礎該是比較差,導致一些不必要的問題,於是把它變成了一道基礎面試題,註意考基礎,同時刪除數組中的多個元素利用索引數組有多少種方式,把可以想到的方法都寫一下哦(其實不是為了難為人,知識想考察一下麵試者javaScript的基礎編寫能力) 接下來介紹這幾種方法,歡迎補充

方法一:先倒序後刪除

這種方式將參數索引數組按照從大到小排序,避免了刪除元素導致的索引偏移

const arr = [1,2,3,4,5,6];
const removeMultipleElement = (rowIndex)=>{
    // 先倒序
    if(Array.isArray(rowIndex)){
        rowIndex = rowIndex.sort((a,b)=>b-a);
        rowIndex.forEach((rowIndex)=>{
            arr.splice(rowIndex,1);
        })
    }
}
removeMultipleElement([1,4]);
console.log(arr);

方法二:使用filter生成新數組

使用 filter 生成新數組,並且結合 includes 。(註意 filter 過濾的內容是淺拷貝過程)

 
let arr = [1,2,3,4,5,6];
const removeMultipleElement = (rowIndex)=>{
    if(Array.isArray(rowIndex)){
        arr =  arr.filter((_,index)=>!rowIndex.includes(index))
    }
}
removeMultipleElement([1,4]);
console.log(arr);

方法三:使用reduce生成新數組

使用 reduce 和 includes 函數,也會生成新數組

let arr = [1,2,3,4,5,6];
const removeMultipleElement = (rowIndex)=>{
    if(Array.isArray(rowIndex)){
        arr = arr.reduce((prev,current,currentIndex)=>{
            if(!rowIndex.includes(currentIndex)){
                prev.push(current)
            }
            return prev
        },[])
    }
}
removeMultipleElement([1,4]);
console.log(arr);

方法四:生成新數組,判斷用Set.has 替換 includes

仍然會生成新數組,只是 includes 判斷使用 set.has 替換,set.has 判斷會比 includes 的性能好一些,但是也要考慮數組數據量的大小,如果只是幾個值,可以不考慮

let arr = [1,2,3,4,5,6];
let newArr = [];
const removeMultipleElement = (rowIndex)=>{
  const rowIndexSet = new Set(rowIndex);
  arr.forEach((item,index)=>{
      if(!rowIndexSet.has(index)){
          newArr.push(item)
      }
  })
}
removeMultipleElement([1,4]);
console.log(newArr);

方法五:標記刪除法加 filter

創建一個與原始數組相同長度的布爾數組 markedForDeletion,用於標記需要刪除的元素。然後,我們遍歷索引數組,將對應的標記設置為 true。最後,我們使用 filter 方法創建一個新數組,只保留未被標記為刪除的元素。

let arr = [1,2,3,4,5,6];
const removeMultipleElement = (rowIndex)=>{
   const markedForDeletion = new Array(arr.length).fill(false);
   for(const index of rowIndex){
       markedForDeletion[index] = true;
   }
   arr = arr.filter((_,index)=>!markedForDeletion[index])
}
removeMultipleElement([1,4]);
console.log(arr)

本文轉載於:

https://juejin.cn/post/7272290608655859731

如果對您有所幫助,歡迎您點個關註,我會定時更新技術文檔,大家一起討論學習,一起進步。

 


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

-Advertisement-
Play Games
更多相關文章
  • EXPLAIN 語句來能夠查看某個查詢語句的具體執行計劃,要搞懂 EPLATN 的各個輸出項都有什麼作用,從而可以有針對性的提升查詢語句的性能。通過使用 EXPLAIN 關鍵字可以模擬優化器執行 SQL 查詢語句,從而知道 MySQL 是如何處理 SQL 語句的。分析查詢語句或是表結構的性能瓶頸。 ...
  • 面對今日頭條、抖音等不同產品線的複雜數據質量場景,火山引擎 DataLeap 數據質量平臺如何滿足多樣的需求? ...
  • 如果你是商家,當你要進行廣告投放的時候,假如平臺推送的用戶都是你潛在的買家,那你就可以花更少的錢,帶來更大的收益。這背後有一項技術支撐,那就是用戶畫像。 ...
  • 本文分享自華為雲社區《GaussDB(DWS)查詢優化技術大揭秘》,作者: 胡辣湯。 大數據時代,數據量呈爆髮式增長,經常面臨百億、千億數據查詢場景,當數據倉庫數據量較大、SQL語句執行效率低時,數據倉庫性能會受到影響。本期《GaussDB(DWS)查詢優化技術大揭秘》的主題直播中,我們邀請到華為雲 ...
  • 現代資料庫系統能夠存儲和處理大量數據。因此,由任何一個用戶單獨負責處理與管理資料庫相關的所有活動的情況相對較少。通常,不同的資料庫用戶需要對資料庫的某些部分具有不同級別的訪問許可權:某些用戶可能只需要讀取特定資料庫中的數據,而其他用戶則必須能夠插入新文檔或修改現有文檔。同樣,應用程式可能需要獨特的許可權 ...
  • C(Chapter) C-01.資料庫概述 1.為什麼要用資料庫 持久化(persistence):把數據保存到可掉電式存儲設備(硬碟)中以供之後使用。大多數情況下,特別是企業應用,數據持久化是將記憶體中的數據保存到硬碟上加以"固化",而持久化的實現過程大多使用各種關係資料庫來完成。 持久化的主要作用 ...
  • 本文分享自華為雲社區《深入理解HarmonyOS UIAbility:生命周期、WindowStage與啟動模式探析》,作者:檸檬味擁抱。 UIAbility組件概述 UIAbility組件是HarmonyOS中一種包含UI界面的應用組件,主要用於與用戶進行交互。每個UIAbility組件實例對應最 ...
  • 只有不斷學習和成長,才能適應這個快速變化的世界。 1. 懶載入 1.1 React 懶載入 React 中懶載入 Lazy 與 Suspense 需要搭配使用。 React.lazy 定義: React.1azy 函數能讓你像渲染常規組件一樣處理動態引入的組件。其實就是懶載入。 為什麼代碼要分割? ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...