javascript数组的常用算法解析

一、不改变原数组,返回新数组(字符串)

1、concat()   连接两个或者多个数组,两边的原始数组都不会变化,返回的是被连接数组的一个副本。

2、join()  把数组中所有的元素放入到一个字符串中,返回字符串


3、slice()    从开始到结束(不包括结束)选择数组的一部分浅拷贝到一个新数组

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、获取属性名: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

<span class="hljs-comment">// 获取所有键值对
<span class="hljs-built_in">console.log(<span class="hljs-string">"获取key")
<span class="hljs-built_in">console.log([...map.keys()]) <span class="hljs-comment">// 输出[1,4]

<span class="hljs-built_in">console.log(<span class="hljs-string">"获取value")
<span class="hljs-built_in">console.log([...map.values()]) <span class="hljs-comment">// 输出[one,two,three,four]

<span class="hljs-built_in">console.log(<span class="hljs-string">"获取map数组")
<span class="hljs-built_in">console.log([...map]) <span class="hljs-comment">// 输出[[1,"one"],[2,"two"],[3,"three"],[4,"four"]]

 

五、两个升序的数组合并成一个升序数组

1、时间复杂度O(M+N),空间复杂度O(M+N)

<span class="hljs-keyword"&gt;while (il < left.length &amp;&amp; ir < right.length) {
    result.push(left[il] < right[ir] ? left[il++] : right[ir++]);

console.log(result);<code class="javascript hljs"> }

<span class="hljs-keyword"&gt;return result.concat(left.slice(il)).concat(right.slice(ir));

}

2、时间复杂度O(M+N),空间复杂度O(1)

= =  right[j]? left[i--] : right[j--];
    = 

 

六、数组重复问题

(一)数组去重

1、reduce方法

 arr.sort().reduce( (init,current) => {
<span class="hljs-keyword"&gt;if (init.length === <span class="hljs-number"&gt;0 || init[init.length - <span class="hljs-number"&gt;1] !== current) {
    init.push( current );
}
<span class="hljs-keyword"&gt;return init;

},[]);

<span class="hljs-keyword">let arr = [<span class="hljs-number">1,<span class="hljs-number">4];
distinct(arr); <span class="hljs-comment">// [1,5]

2、filter方法

 arr.filter( (element,index,self) => {
    <span class="hljs-keyword">let arr = [<span class="hljs-number">1,4]

 

(二)排序数组去重

<span class="hljs-keyword"&gt;if(!nums || nums.length == <span class="hljs-number"&gt;0) <span class="hljs-keyword"&gt;return <span class="hljs-number"&gt;0;

<span class="hljs-keyword"&gt;let len = <span class="hljs-number"&gt;0;
<span class="hljs-keyword"&gt;for(<span class="hljs-keyword"&gt;let i = <span class="hljs-number"&gt;1; i < nums.length; i++) {
    <span class="hljs-keyword"&gt;if (nums[len] != nums[i]) {
        nums[++ len] = nums[i];
    }
}
<span class="hljs-keyword"&gt;return len + <span class="hljs-number"&gt;1;

};

 

(三)判断数组是否存在重复

<span class="hljs-keyword"&gt;let hashMap = <span class="hljs-keyword"&gt;new <span class="hljs-built_in"&gt;Map();
<span class="hljs-keyword"&gt;for(<span class="hljs-keyword"&gt;let i = <span class="hljs-number"&gt;0; i < nums.length; i++) {

    <span class="hljs-keyword"&gt;if( hashMap.has(nums[i]) ) {
       <span class="hljs-keyword"&gt;return <span class="hljs-literal"&gt;true;
    }

    hashMap.set(nums[i],<span class="hljs-number"&gt;1);
}

<span class="hljs-keyword"&gt;return <span class="hljs-literal"&gt;false;

};

 

七、两个数组的交集

给定两个数组,写一个方法来计算它们的交集。

例如:

给定 nums1 = [1,1],nums2 = [2,2],返回 [2,2].

注意:1、出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。2、

  • 我们可以不考虑输出结果的顺序。

跟进:1、如果给定的数组已经排好序呢?你将如何优化你的算法?2、如果 nums1 的大小比 nums2 小很多,哪种方法更优?3、如果nums2的元素存储在磁盘上,内存是有限的,你不能一次加载所有的元素到内存中,你该怎么办?

解法:

<span class="hljs-keyword"&gt;var map1 = <span class="hljs-keyword"&gt;new <span class="hljs-built_in"&gt;Map();
<span class="hljs-keyword"&gt;var number = [];

<span class="hljs-keyword"&gt;for(<span class="hljs-keyword"&gt;var i = <span class="hljs-number"&gt;0; i < nums1.length; i++) {
    <span class="hljs-keyword"&gt;var map1Value = map1.get(nums1[i]);
    map1.set( nums1[i],( map1Value ? map1Value : <span class="hljs-number"&gt;0 ) + <span class="hljs-number"&gt;1 );
}

<span class="hljs-keyword"&gt;for(<span class="hljs-keyword"&gt;var i = <span class="hljs-number"&gt;0; i < nums2.length; i++) {
    <span class="hljs-keyword"&gt;if( map1.has(nums2[i]) &amp;&amp; map1.get(nums2[i]) != <span class="hljs-number"&gt;0 ) {
        number.push(nums2[i]);
        map1.set( nums2[i],map1.get(nums2[i]) - <span class="hljs-number"&gt;1 );
    }
}

<span class="hljs-keyword"&gt;return number;

};

 

八、找出一个数组中只出现一次的数字

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

<span class="hljs-keyword"&gt;let number = <span class="hljs-number"&gt;0;
<span class="hljs-keyword"&gt;for(<span class="hljs-keyword"&gt;let i = <span class="hljs-number"&gt;0; i < nums.length; i++) {
    number ^= nums[i];
}
<span class="hljs-keyword"&gt;return number;

};

 

文章首发:

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


问题背景 最近小伙伴提了一个希望提高后台下拉列表可操作性的需求,原因是下拉列表选项过多,每次下拉选择比较费时费力且容易出错,硬着头皮啃了啃前端知识,网上搜寻了一些下拉列表实现的资料,这里总结一下。 P
// n位随机数生成 function randomNum(n) { let sString = &quot;&quot;; let strings = &quot;abcdefghijklmnopq
HTML是HyperText Markup Language的简称,中文名称:超文本标记语言,它是一种用于创建网页的 标准标记语言
层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML或XML(标准通用标记语言的一个子集)等文件样式的计算机语言。
JavaScript 是脚本语言,是一种解释性脚本语言(代码不进行预编译)
本文由葡萄城技术团队原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 一名开发者或设计师通常可以在一秒内指出优秀的设计,但对于糟糕的设计只需最多半
本文由葡萄城技术团队原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 Excel是我们办公中常用的工具 ,它几乎能为我们处理大部分数据,友好的交互
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 原文出处:https://blog.bitsrc.io/8-tips-for-an-awesome-sign
本文由葡萄城技术团队于博客园翻译并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 如果我们自己编写从URL中分析和提取元素的代码,那么有可能会比较痛苦
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 原文出处:https://blog.bitsrc.io/what-is-deno-and-will-it-r
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 原文出处:https://blog.bitsrc.io/4-reasons-to-use-sass-in-y
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 原文出处:https://blog.bitsrc.io/vuejs-3-0-0-beta-features-
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 原文出处:https://blog.bitsrc.io/sessionstorage-and-localst
一直以来,JavaScript使用数组和对象来定义和存放结构化数据, 在这篇文章中,我们将一起深挖另一种对象Map的一切,我们将会去了解它是什么、如何遍历、都包括什么属性和方法以及优缺点是什么。
由于CSS的出现,现在的网站风格已经与它们很早之前的样子有了很大的不同。CSS的出现为原本平平无奇的网页注入了活力。这也是网站的用户体验得到进一步进化的原因。这可能就是当今几乎所有的网站或多或少都在使
自苹果推出了iPhone应用商店以来,App成为了我们生活中不可或缺的一部分,而对于实体业务也是如此,现在各行业都在推出自己的App,但有没有人想过这样一种场景,如果自己的潜在客户还没有安装你的App
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 原文出处:https://blog.bitsrc.io/10-top-chrome-extensions-f
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 原文出处:https://blog.bitsrc.io/do-your-buttons-lead-or-mi
本文由葡萄城技术团队原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 前段时间在开发【葡萄城社区】公众号时有一个功能是需要用网页授权认证地址生成二
本文由葡萄城技术团队原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 HTML5的发展改变了互联网技术趋势,前端热度依旧不减,所以对于应用开发人员