javascript中数组的常用算法深入分析
Array数组是Javascript构成的一个重要的部分,它可以用来存储字符串、对象、函数、Number,它是非常强大的。因此深入了解Array是前端必修的功课。本文将给大家详细介绍了javascript中数组的常用算法,下面话不多说了,来一起看看详细的介绍吧
一、jQuery插件不改变原数组,返回新数组(字符串)
1、concat() 连接两个或者多个数组,两边的原始数组都不会变化,返回的是被连接数组的一个副本。
2、join() 把数组中所有的元素放入到一个字符串中,返回字符串
1
2
3
|
var a = [1,2,3]; a.join([4,5,6]); // "14,5,624,5,63" a.join( 'sau' ); // "1sau2sau3" |
3、slice() 从开始到结束(不包括结束)选择数组的一部分浅拷贝到一个新数组
1
2
3
4
5
6
7
|
var a = [1,2,3,4,5]; a.slice(0,0); //[] a.slice(0,1); //[1] a.slice(2,4); //[3,4] a.slice(0,5); //[1,2,3,4,5] a.slice(10,1); //[] a.slice(4); //[5] |
4、map() 创建一个新的数组并返回,其中新数组的每一个元素由调用原始数组中的每一个元素执行提供的函数得来,原数组不变
5、every() 对数组中的每一个元素都执行一次指定的回调函数,直到回调函数返回false,此时every()返回false并不再继续执行,如果回调函数都对每一个元素都返回true,那么every()返回true。
6、some() 对数组中的每一个元素都执行一次指定的回调函数,直到回调函数返回true,此时some()返回true并不再执行。如果回调函数对每一个元素都返回false,那么some()将返回false。
7、filter() 创建一个新数组,其中包含通过所提供函数实现的测试的所有元素。
二、改变原数组
1、forEach() 针对每一个元素执行提供的函数。会修改原来的数组,不会返回执行结果,返回undefined。
2、pop() 删除数组最后一个元素,返回被删除的元素的值,如果数组为空,则不改变数组,返回undefined。
3、push() 向数组末尾添加一个或多个元素,返回改变后数组的长度。
4、reverse() 颠倒数组中元素的位置,返回该数组的引用。
5、shift() 从数组中删除第一个元素,改变原数组,并返回该元素的值。
6、unshift() 将一个或者多个元素添加到数组的开头,并返回新数组的长度。
7、sort() 对数组的元素进行排序,返回数组。排序不一定是稳定的。默认排序顺序是根据字符串unicode码点。
8、splice() 向数组中添加/删除元素,然后返回被删除的新数组()。
1
2
3
4
|
var a = [1,2,3,4,5]; a.splice(0,1); //删除从0位置开始的1个 返回[1] a为[2,3,4,5] a.splice(1,0,99) //在1的位置插入99 [2,99,3,4,5] a.splice(1,1,88) //99替换为88 [2,88,3,4,5] |
三、遍历方法
1、获取属性名:for...in 和object.key()的区别
答:1、for in 遍历对象可以枚举的属性名列表,包括[[prototype]]原型链;
2、Object.keys() 只查找属性名是否在对象中,返回一个数组,包含所有可以枚举的属性名;
3、Object.getOwnPropertyNames()只查找属性名是否在对象中,返回一个数组,包含所有的属性名,不论是否可枚举。
2、获取属性值: for... of 和object.values()
for of 语句:遍历可迭代对象的可枚举属性值列表,包括[[propertype]]原型链;
object.values() :返回一个给定对象自身的所有可枚举属性的值,不包括原型链。
四、ES6语法Map键值对转化为数组
new Map创建一个map
1
2
3
4
5
6
7
8
9
10
11
12
13
|
// new Map创建一个map let map = new Map([[1, "one" ], [2, "two" ], [3, "three" ]]); map.set(4, "four" ); // 获取所有键值对 console.log( "获取key" ) console.log([...map.keys()]) // 输出[1, 2, 3, 4] console.log( "获取value" ) console.log([...map.values()]) // 输出[one, two, three, four] console.log( "获取map数组" ) console.log([...map]) // 输出[[1, "one"], [2, "two"], [3, "three"], [4, "four"]] |
五、两个升序的数组合并成一个升序数组
1、时间复杂度O(M+N),空间复杂度O(M+N)
1
2
3
4
5
6
7
8
9
10
11
12
|
function merge(left, right){ let result = [], il = 0, ir = 0; while (il < left.length && ir < right.length) { result.push(left[il] < right[ir] ? left[il++] : right[ir++]); console.log(result); } return result.concat(left.slice(il)).concat(right.slice(ir)); } |
2、时间复杂度O(M+N),空间复杂度O(1)
1
2
3
4
5
6
7
8
9
|
// m, n 是数组长度 function merge(left, m, right, n) { var i = m - 1, j = n - 1, writeIdx = m + n - 1; while (i >= 0 && j >= 0) left[writeIdx--] = left[i] > right[j]? left[i--] : right[j--]; while (j >= 0) left[writeIdx--] = right[j--]; return left; } |
六、数组重复问题
(一)数组去重
1、reduce方法
1
2
3
4
5
6
7
8
9
10
|
const distinct = arr => arr.sort().reduce( (init, current) => { if (init.length === 0 || init[init.length - 1] !== current) { init.push( current ); } return init; }, []); let arr = [1,2,1,2,3,5,4,5,3,4,4,4,4]; distinct(arr); // [1, 2, 3, 4, 5] |
2、filter方法
1
2
3
4
5
6
|
const distinct = arr => arr.filter( (element, index, self) => { return self.indexOf( element ) === index; }); let arr = [1,2,1,2,3,5,4,5,3,4,4,4,4]; distinct(arr); // [1, 2, 3, 5, 4] |
(二)排序数组去重
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
/** * @param {number[]} nums * @return {number} */ var removeDuplicates = function (nums) { if (!nums || nums.length == 0) return 0; let len = 0; for (let i = 1; i < nums.length; i++) { if (nums[len] != nums[i]) { nums[++ len] = nums[i]; } } return len + 1; }; |
(三)判断数组是否存在重复
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
/** * @param {number[]} nums * @return {boolean} */ var containsDuplicate = function (nums) { let hashMap = new Map(); for (let i = 0; i < nums.length; i++) { if ( hashMap.has(nums[i]) ) { return true ; } hashMap.set(nums[i], 1); } return false ; }; |
七、两个数组的交集
给定两个数组,写一个方法来计算它们的交集。
例如:
给定 nums1 = [1, 2, 2, 1], nums2 = [2, 2], 返回 [2, 2].
注意:1、出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。2、
我们可以不考虑输出结果的顺序。
跟进:1、如果给定的数组已经排好序呢?你将如何优化你的算法?2、如果 nums1 的大小比 nums2 小很多,哪种方法更优?3、如果nums2的元素存储在磁盘上,内存是有限的,你不能一次加载所有的元素到内存中,你该怎么办?
解法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
/** * @param {number[]} nums1 * @param {number[]} nums2 * @return {number[]} */ var intersect = function (nums1, nums2) { var map1 = new Map(); var number = []; for ( var i = 0; i < nums1.length; i++) { var map1Value = map1.get(nums1[i]); map1.set( nums1[i], ( map1Value ? map1Value : 0 ) + 1 ); } for ( var i = 0; i < nums2.length; i++) { if ( map1.has(nums2[i]) && map1.get(nums2[i]) != 0 ) { number.push(nums2[i]); map1.set( nums2[i], map1.get(nums2[i]) - 1 ); } } return number; }; |
八、找出一个数组中只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
1
2
3
4
5
6
7
8
9
10
11
12
|
/** * @param {number[]} nums * @return {number} */ var singleNumber = function (nums) { let number = 0; for (let i = 0; i < nums.length; i++) { number ^= nums[i]; } return number; }; |
javascript中数组的常用算法深入分析的更多相关文章
- JavaScript中数组常用方法的总结
JavaScript中数组Array常用的方法总结 标签(空格分隔): JavaScript ECMAScript数组给我们提供了许多常用的方法,便于我们对数组进行操作,下面,就来总结一下这些方法. ...
- javascript中数组常用方法总结
原文:javascript中数组常用方法总结 在javascript的基础编程中,数组是我们最常遇到的,那么数组的一些常用方法也是我们必须要掌握的,下面我们总结一下数组中常用的方法. toString ...
- 前端面试之JavaScript中数组的方法!【残缺版!!】
前端面试之JavaScript中数组常用的方法 7 join Array.join()方法将数组中所有元素都转化为字符串并连接在-起,返回最后生成的字 符串.可以指定一个可选的字符串在生成的字符串中来 ...
- JavaScript中数组操作常用方法
JavaScript中数组操作常用方法 1.检测数组 1)检测对象是否为数组,使用instanceof 操作符 if(value instanceof Array) { //对数组执行某些操作 } 2 ...
- javascript中数组Array的方法
一.常用方法(push,pop,unshift,shift,join)push pop栈方法,后进先出var a =[1,2,3];console.log(a.push(40)); //4 返回数组的 ...
- Javascript中数组
Javascript中数组 1.什么是数组 所谓的数组就是一组数据的集合,在内存中表现为一段连续的内存地址(保存在堆内存) 2.创建数组的含义 创建数组的目的:就是为了保存更多的数据 3.数组的定义 ...
- JavaScript中数组Array方法详解
ECMAScript 3在Array.prototype中定义了一些很有用的操作数组的函数,这意味着这些函数作为任何数组的方法都是可用的. 1.Array.join()方法 Array.join()方 ...
- javascript中数组化的一般见解
javascript中数组化的一般见解,数组化浏览器中存在许多类数组对象,往往对类数组操作比较麻烦,没有数组那些非常方便的方法,在这种情况下,就有了数组化方法. 数组化的一般方法 1.第一种也是我们最 ...
- 总结Javascript中数组各种去重的方法
相信大家都知道网上关于Javascript中数组去重的方法很多,这篇文章给大家总结Javascript中数组各种去重的方法,相信本文对大家学习和使用Javascript具有一定的参考借鉴价值,有需要的 ...
随机推荐
- eclipse使用和快捷键
一.快捷键 - ctrl + shift + o 导包 - ctrl + shift + t 快速查找某个类 - 先按ctrl + 2 ,再点L, 创建变量并命名 - ctrl + o , 在当前类中 ...
- 巧用这19条MySQL优化,效率至少提高3倍
阅读本文大概需要 3.8 分钟. 作者丨喜欢拿铁的人 https://zhuanlan.zhihu.com/p/49888088 本文我们来谈谈项目中常用的MySQL优化方法,共19条,具体如下: 1 ...
- Python学习笔记【第十一篇】:Python面向对象高级
isinstance(obj,cls)和issubclass(sub,super) class Person(object): def __init__(self, name, age, sex, n ...
- spring cloud config配置记录
1. spring cloud config配置记录 1.1. pom <!-- 分布式配置中心 --> <dependency> <groupId>org.spr ...
- java:当字符串为We Are Happy.经过替换之后的字符串为We%20Are%20Happy
方法一: public class Solution { public String replaceSpace(StringBuffer str) { String a=str.toString(); ...
- Spring详解(七)------AOP 注解
上一篇博客我们讲解了 AspectJ 框架如何实现 AOP,然后具体的实现方式我们是通过 xml 来进行配置的.xml 方式思路清晰,便于理解,但是书写过于麻烦.这篇博客我们将用 注解 的方式来进行 ...
- js自定义水印
前言:今天在github上看到了一个定义水印的项目,因为获取的星星还蛮多,就多看了几眼,发现该项目简单有趣,心想以后可能会用的到,并且我下载到本地并亲自测试运行了一波.其实该项目最吸引我的是它定义js ...
- ssh免密码快速登录配置
使用ssh登录服务器的时候,需要输入ip地址.端口.用户名.密码等信息,比较麻烦,容易输错.还好,通过客户端和服务器的配置参数,可实现免密码快速登录.服务器可通过保存客户端的公钥,用于验证客户端的身份 ...
- 【翻译】JavaScript内存泄露
原文地址:http://javascript.info/tutorial/memory-leaks#tools 我们在进行JavaScript开发时,很少会考虑内存的管理.JavaScript中变量的 ...
- mysql 开发进阶篇系列 8 锁问题 (共享锁与排它锁演示)
1 .innodb 共享锁(lock in share mode)演示 会话1 会话2 SET autocommit=0; SELECT cityname FROM city WHERE city_ ...