前端面試寶典總結4-手搓代碼JavaScript(數據處理)

前端面試寶典總結4之手寫代碼JavaScript(數據處理)

本文章 對各大學習技術論壇知識點,進行總結、歸納自用學習,共勉🙏

上一篇👉: 前端面試寶典總結3-JavaScript(2)

文章目錄

  • 前端面試寶典總結4之手寫代碼JavaScript(數據處理)
  • 1.實現數組元素求和(Sum)
  • 2.實現數組的亂序輸出
  • 3.數組過濾(Filter)
  • 4.數組排序(Sort)
  • 5.數組去重(Remove duplicates)
  • 6.查找元素(Find)
  • 7.實現日期格式化函數
  • 8.交換a,b的值,不能用臨時變量
  • 9.實現數組的扁平化

1.實現數組元素求和(Sum)

  • 簡單數組求和 :arr=[1,2,3,4,5,6,7,8,9,10],求和
let arr= [1, 2, 3, 4, 5, 6, 7, 8, 9];
let sum = arr.reduce( (total,i) => total += i,0);
console.log(sum);
  • 嵌套數組求和: arr=[1,2,3,[[4,5],6],7,8,9],求和
var = arr=[1, 2, 3, [[4,5],6],7,8 , 9]
let arr= arr.toString().split(',').reduce( (total,i) => total += Number(i),0);
console.log(arr);

遞歸實現:

let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9] function add(arr) {if (arr.length == 1) return arr[0] return arr[0] + add(arr.slice(1)) 
}
console.log(add(arr)) // 45var arr = [1, 2, 3, [[4, 5], 6], 7, 8, 9]];
function sumNestedArray(arr) {let total = 0;arr.forEach(element => {if(Array.isArray(element)) {total += sumNestedArray(element);} else {total += element;}});return total;
}console.log(sumNestedArray(arr)); // 輸出: 45

2.實現數組的亂序輸出

實現思路:

  • 取出數組的第一個元素,隨機產生一個索引值,將該第一個元素和這個索引對應的元素進行交換。
  • 第二次取出數據數組第二個元素,隨機產生一個除了索引為1的之外的索引值,并將第二個元素與該索引值對應的元素進行交換
  • 按照上面的規律執行,直到遍歷完成

原地交換法

var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
for (var i = 0; i < arr.length; i++) {const randomIndex = Math.round(Math.random() * (arr.length - 1 - i)) + i;[arr[i], arr[randomIndex]] = [arr[randomIndex], arr[i]];
}
console.log(arr)

倒序遍歷法:

var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
let length = arr.length;
while (length > 1) {const randomIndex = Math.floor(Math.random() * length);length--;[arr[length], arr[randomIndex]] = [arr[randomIndex], arr[length]];
}
console.log(arr);

3.數組過濾(Filter)

const array1 = [1, 2, 3];
const array2 = [4, 5, 6];
const combinedArray = array1.concat(array2);
console.log(combinedArray); // 輸出: [1, 2, 3, 4, 5, 6]

4.數組排序(Sort)

const fruits = ['banana', 'apple', 'cherry', 'date'];
fruits.sort();
console.log(fruits); // 輸出: ['apple', 'banana', 'cherry', 'date']// 對象數組按屬性排序
const people = [{name: 'Alice', age: 30},{name: 'Bob', age: 25}
];
people.sort((a, b) => a.age - b.age);
console.log(people);

5.數組去重(Remove duplicates)

  • 使用 Set(ES6 提供的新數據結構)
const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueArray = [...new Set(array)];
console.log(uniqueArray); // 輸出: [1, 2, 3, 4, 5]
  • 使用 filter 方法
const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueArray = array.filter((value, index, self) => self.indexOf(value) === index);
console.log(uniqueArray); // 輸出: [1, 2, 3, 4, 5]
  • 使用 reduce 方法
const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueArray = array.reduce((accumulator, current) => accumulator.includes(current) ? accumulator : [...accumulator, current], []);
console.log(uniqueArray); // 輸出: [1, 2, 3, 4, 5]
  • 雙重循環檢查(傳統方法)
function uniqueArrayTraditional(arr) {var result = [];for (var i = 0; i < arr.length; i++) {var item = arr[i];if (result.indexOf(item) === -1) {result.push(item);}}}return result;
}
console.log(uniqueArrayTraditional([1, 2, 2, 3, 4, 4, 5])); // 輸出: [1, 2, 3, 4, 5]
  • 利用對象鍵特性
function uniqueByKey(arr) {var map = {};arr.forEach(item => map[item] = true);return Object.keys(map);
}
console.log(uniqueByKey([1, 2, 2, 3, 4, 4, 5])); // 輸出: ["1", "2", "3", "4", "5"]
  • 使用 Map
function uniqueWithMap(arr) {return Array.from(new Map(arr.map(item => [item, item])).map(([item]) => item));
}
console.log(uniqueWithMap([1, 2, 2, 3, 4, 4, 5])); // 輸出: [1, 2, 3, 4, 5]

6.查找元素(Find)

const array = [1, 2, 3, 4, 5];
const found = array.find(element => element > 3);
console.log(found); // 輸出: 4

7.實現日期格式化函數

const dateFormat = (dateInput, format) => {let day = dateInput.getDate();let month = dateInput.getMonth() + 1; // 月份需要加1,因為getMonth()返回的月份是從0開始的let year = dateInput.getFullYear();// 添加前導零處理day = day < 10 || day > 9 ? day : '0' + day;month = month < 10 ? '0' + month : month;format = format.replace(/yyyy/g, year);format = format.replace(/MM/g, month); // 確保月份已經做了前導零處理format = format.replace(/dd/g, day);   // 確保日期已經做了前導零處理return format;
};// 測試用例
console.log(dateFormat(new Date('2020-12-01'), 'yyyy/MM/dd')); // 應輸出: 2020/12/01
console.log(dateFormat(new Date('2020-04-01'), 'yyyy/MM/dd')); // 應輸出: 2020/04/01
console.log(dateFormat(new Date('2020-04-01'), 'yyyy年MM月dd日')); // 應輸出: 2020年04月01日

8.交換a,b的值,不能用臨時變量

  • 使用算術運算(限于數值交換)

不適用于非數值類型的變量,并且可能會有精度損失(對于浮點數)

a = a + b;
b = a - b;
a = a - b;
  • 使用數組解構賦值

這段代碼首先創建了一個包含b和a值的新數組,然后立即解構這個數組,將b的值賦給a,a的值賦給b,從而實現了交換。

[a, b] = [b, a];

9.實現數組的扁平化

數組的扁平化,即將一個多維數組轉換為一維數組,可以通過遞歸或ES6的展開運算符等多種方法實現。

  • 使用遞歸
function flatten(arr) {let result = [];for(let i = 0; i < arr.length; i++) {if(Array.isArray(arr[i])) {result = result.concat(flatten(arr[i]));} else {result.push(arr[i]);}}}return result;
}let nestedArray = [1, [2, [3, [4, 5], 6], 7], 8, 9];
console.log(flatten(nestedArray)); // 輸出: [1, 2, 3, 4, 5, 6, 7, 8, 9]
  • 使用ES6的展開運算符(…)
function flattenES6(arr) {while(arr.some(item => Array.isArray(item))) {arr = [].concat(...arr);}return arr;
}let nestedArray = [1, [2, [3, [4, 5], 6], 7], 8, 9];
console.log(flattenES6(nestedArray)); // 輸出: [1, 2, 3, 4, 5, 6, 7, 8, 9]
  • 使用reduce和遞歸
function flattenReduce(arr) {return arr.reduce((acc, val) => Array.isArray(val) ? acc.concat(flattenReduce(val)) : acc.concat(val), []);
}, []);let nestedArray = [1, [2, [3, [4, 5], 6], 7], 8, 9];
console.log(flattenReduce(nestedArray)); // 輸出: [1, 2, 3, 4, 5, 6, 7, 8, 9]
  • 使用棧(非遞歸)
function flattenStack(arr) {let stack = [...arr], result = [];while(stack.length) {let next = stack.pop();if(Array.isArray(next)) {stack.push(...next);} else {result.push(next);}}}return result.reverse();
}let nestedArray = [1, [2, [3, [4, 5], 6], 7], 8, 9];
console.log(flattenStack(nestedArray)); // 輸出: [1, 2, 3, 4, 5, 6, 7, 8, 9]

上述方法各有特點,遞歸方法直觀易懂,但在處理極深的嵌套時可能會遇到棧溢出問題;ES6展開運算符簡潔高效,但需要考慮兼容性;使用reduce和棧的方法則提供了不同的思考角度,適用于處理大量數據或深度嵌套的情況。

下一篇👉: 前端面試寶典總結4-手搓代碼JavaScript(基礎版)

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

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

相關文章

python長方形周長面積 2024年3月青少年編程電子學會python編程等級考試二級真題解析

目錄 python長方形周長面積 一、題目要求 1、編程實現 2、輸入輸出 二、算法分析 三、程序代碼 四、程序說明 五、運行結果 六、考點分析 七、 推薦資料 1、藍橋杯比賽 2、考級資料 3、其它資料 python長方形周長面積 2024年3月 python編程等級考試級編程題 一、…

matlab模擬太陽耀斑噴發

代碼 function simulate_solar_flare% 參數設置gridSize 100; % 網格大小timeSteps 200; % 時間步數dt 0.1; % 時間步長% 初始化網格[X, Y] meshgrid(linspace(-5, 5, gridSize));Z zeros(size(X));% 設置耀斑初始位置和強度flareCenter [0, 0]; % 耀斑中心位置flareRad…

【實用技巧】Unity中的Image組件

Unity中的Image組件是UI系統的核心部分&#xff0c;用于顯示圖像和紋理。以下是一些關于Unity Image組件的實用技巧&#xff1a; 使用Sprite作為Image源&#xff1a; 將Sprite直接拖拽到Image組件的Source Image字段中&#xff0c;可以快速設置顯示的圖像。 調整顏色和透明度&a…

9 -力扣高頻 SQL 50 題(基礎版)

9 - 上升的溫度 -- 找出與之前&#xff08;昨天的&#xff09;日期相比溫度更高的所有日期的 id -- DATEDIFF(2007-12-31,2007-12-30); # 1 -- DATEDIFF(2010-12-30,2010-12-31); # -1select w1.id from Weather w1, Weather w2 wheredatediff(w1.recordDate,w2.recordDat…

SolidWorks功能強大的三維設計軟件下載安裝,SolidWorks最新資源獲取!

SolidWorks&#xff0c;它憑借出色的三維建模能力&#xff0c;使得設計師們能夠輕松構建出復雜且精細的機械模型&#xff0c;大大提升了設計效率和質量。 在機械設計領域&#xff0c;SolidWorks憑借其豐富的工具和特性&#xff0c;讓設計師們能夠隨心所欲地揮灑創意。無論是零…

Flutter 中的 LayoutBuilder 小部件:全面指南

Flutter 中的 LayoutBuilder 小部件&#xff1a;全面指南 Flutter 是一個功能豐富的 UI 框架&#xff0c;它允許開發者使用 Dart 語言來構建高性能、美觀的跨平臺應用。在 Flutter 的布局系統中&#xff0c;LayoutBuilder 是一個強大的組件&#xff0c;它可以根據父容器的約束…

家政預約小程序12用戶登錄

目錄 1 創建全局變量2 創建頁面3 搭建頁面4 實現登錄邏輯總結 在小程序中&#xff0c;登錄是一個常見的場景。比如我們在小程序預約或者購買時&#xff0c;通常要求用戶先登錄后購買。如果使用傳統方案&#xff0c;登錄這個動作其實最終的目的是為了獲取用戶的openid。而使用低…

Python學習圣經:從0到1,精通Python使用

尼恩&#xff1a;LLM大模型學習圣經PDF的起源 在40歲老架構師 尼恩的讀者交流群(50)中&#xff0c;經常性的指導小伙伴們改造簡歷。 經過尼恩的改造之后&#xff0c;很多小伙伴拿到了一線互聯網企業如得物、阿里、滴滴、極兔、有贊、希音、百度、網易、美團的面試機會&#x…

【智能體】文心智能體大賽第二季持續進行中,一起在智能體的海洋里發揮你的創意吧

目錄 背景作文小助手AI迅哥問答程序員黃歷助手比賽時間第二期賽題豐厚獎品評選說明獲獎智能體推薦文章 背景 AI應用&#xff08;智能體&#xff09;&#xff0c;持續火熱&#xff0c;一句話就能創建一個有趣、好玩的應用。 可以說一分鐘內就能創建一個有創意的智能體。 看大多…

Linux網絡-自定義協議、序列化和反序列化、網絡計算服務器的實現和Windows端客戶端

文章目錄 前言一、自定義協議傳結構體對象 序列化和反序列化什么是序列化&#xff1f;反序列化 二、計算器服務端&#xff08;線程池版本&#xff09;1.main.cc2.Socket.hpp3.protocol.hpp4.Calculator.hpp5.serverCal.hpp6.threadPool.hpp7.Task.hpp8. log.hpp 客戶端Windows客…

我有點想用JDK17了

大家好呀&#xff0c;我是summo&#xff0c;JDK版本升級的非常快&#xff0c;現在已經到JDK20了。JDK版本雖多&#xff0c;但應用最廣泛的還得是JDK8&#xff0c;正所謂“他發任他發&#xff0c;我用Java8”。 其實我也不太想升級JDK版本&#xff0c;感覺投入高&#xff0c;收…

華為、華三交換機、路由器啟用基于端口的環回檢測功能配置

目的 在進行某些特殊功能測試時&#xff0c;例如初步定位以太網故障時&#xff0c;需要開啟以太網接口環回檢測功能&#xff0c;測試接口功能是否異常。 當以太網接口無故障時&#xff0c;開啟環回檢測功能后接口物理狀態和協議狀態將始終處于Up狀態&#xff1b;如果以太網接口…

Linux環境搭建NextCloud

NextCloud是什么 Nextcloud是一款開源免費的私有云存儲網盤項目&#xff0c;可以讓你快速便捷的搭建一套屬于自己或者團隊的云同步網盤&#xff0c;從而實現跨平臺跨設備文件同步&#xff0c;共享&#xff0c;版本控制&#xff0c;團隊協做等功能。它的客戶端覆蓋windows&#…

使用AdaBoost分類方法實現對Wine數據集分類

目錄 1. 作者介紹2. 什么是AdaBoost&#xff1f;2.1 什么是弱分類器2.2 什么是強分類器2.3 如何自適應增強2.4 如何組合弱分類器成為一個強分類器&#xff1f; 3. 什么是Wine數據集3.1 Wine 數據集3.2 Wine 數據集結構 4. 使用AdaBoost分類方法實現對Wine數據集分類5. 完整代碼…

PLC的編程方式有什么編程:深度探索與實用指南

PLC的編程方式有什么編程&#xff1a;深度探索與實用指南 在現代工業自動化領域&#xff0c;可編程邏輯控制器&#xff08;PLC&#xff09;扮演著至關重要的角色。PLC的編程方式多種多樣&#xff0c;每種方式都有其獨特的優點和適用場景。本文將從四個方面、五個方面、六個方面…

k8s 配置資源管理

一、Secret的資源配置 1.1 Secret配置的相關說明 Secret 是用來保存密碼、token、密鑰等敏感數據的 k8s 資源&#xff0c;這類數據雖然也可以存放在 Pod 或者鏡像中&#xff0c;但是放在 Secret 中是為了更方便的控制如何使用數據&#xff0c;并減少暴露的風險。 有四種類型&a…

日志優化開發效率

日志怎么打&#xff1f; 1.在關鍵節點打日志 (1).請求入口 (2).結果響應 2.可能發生錯誤的節點打日志 3.日志不是越多越好&#xff0c;打日志也會消耗性能 RequestMapping("/add")public Boolean publishBlog(String title, String content, HttpServletRequest req…

react快速開始(四)-之Vite 還是 (Create React App) CRA? 用Vite創建項目

文章目錄 react快速開始(四)-之Vite 還是 (Create React App) CRA? 用Vite創建項目背景Vite 和 (Create React App) CRAVite&#xff1f;Vite 是否支持 TypeScript&#xff1f; 用Vite創建react項目參考 react快速開始(四)-之Vite 還是 (Create React App) CRA? 用Vite創建項…

Java面向對象筆記

多態 一種類型的變量可以引用多種實際類型的對象 如 package ooplearn;public class Test {public static void main(String[] args) {Animal[] animals new Animal[2];animals[0] new Dog();animals[1] new Cat();for (Animal animal : animals){animal.eat();}} }class …

Java面試題-集合

Java面試題-集合 1、什么是集合&#xff1f;2、集合和數組的區別是什么&#xff1f;3、集合有哪些特點&#xff1f;4、常用的集合類有哪些&#xff1f;5、List&#xff0c; Set&#xff0c; Map三者的區別&#xff1f;6、說說集合框架底層數據結構&#xff1f;7、線程安全的集合…