前端面试宝典总结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.mzph.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、线程安全的集合…