遍历方式 && 数组方法 && 算法
遍历方式
一般,我们常用for in遍历对象,使用for (var i = 0; i < len; i++) {}的方式来遍历数组,这是最常用的两种方式,但是优缺点呢?
1、for (var i = 0; i < len; i++){}
这种方式在遍历数组来说是最快的,一般遍历数组也都是使用这种方法。
2、for...in
这种方式在遍历对象的属性时也会常常用到,但是这种方式的效率很低,因为for...in有一些特殊的要求,包括:
- 遍历所有的属性,不仅仅是own propertites的,也有原型链上的。
- 必须按照特定顺序遍历,先遍历所有的数字键,然后再按照创建属性的顺序遍历其他的。
var obj = {
name: 'wayne',
: ,
age: ,
: ,
: ,
toString: function () {
console.log('foo');
}
}
for (var key in obj) {
console.log(key);
}
即如上所示的对象,最终的结果为:
即确实是先输出所有的数字,并且数字进行了排序,然后再输出所有的其他类型,并且类型是按照创建顺序。
且记住:用for遍历是比for-in快的,所以数组绝对不要使用for-in来遍历。
3、for...of
for...of是es6中的遍历语法,它可以遍历数组、字符串、arguments等。
推荐网站:https://jsperf.com/ 用于测试性能。即JavaScript performance的意思。
数组方法
注意: 下面的1 - 4的方法中传入的函数都接受三个参数 --- value, index,array
1. forEach
forEach 就是对于每一个的意思。 所以其中接受的函数没有返回值,只是对数组的每一个元素做一些事情而已。
接受三个参数:第一个是value, 第二个是index, 第三个是数组本身。
如下:
var arr = [,,,];
arr.forEach(function (value, index, arr) {
console.log(value, index, arr);
});
输出为:
下面是数组去重的一个应用:
function unique(str) {
var tmpObj = {};
var uniqueStr = '';
str.split('').forEach(function(item) {
if(!tmpObj[item]) {
tmpObj[item] = ;
uniqueStr += item;
}
});
return uniqueStr;
}
2. map
map 就是映射的意思, 即对于数组,做了某件事情之后, 成了另外一个映射出来的数组。
var arr = [,,,];
var anotherArr = arr.map(function (value) {
return value * ;
});
console.log(anotherArr); //[90, 156, 178, 112]
显然,由于是映射,所以不会改变原来数组,而是return一个新的数组。
3. filter
显然就是过滤的意思了,最后返回过滤后的数组。
var arr = [,,,];
var anotherArr = arr.filter(function (value, index) {
return index > ;
});
console.log(anotherArr); //[56]
4. every() 和 some()
这两者最后返回一个布尔值。 对于前者必须全部满足才会为true, 后者只要有一个满足就会返回true。
var arr = [,,,];
var bool = arr.every(function (value, index) {
return index >= ;
});
console.log(bool); //true
var anotherBool = arr.some(function (value, index) {
return value > ;
});
console.log(anotherBool); //true
5. reduce() 和 reduceRight()
reduce有归纳的意思,它一般接受两个参数,第一个参数是就之前我们所说的唯一的函数, 第二个参数是一个初始值。
var anotherSum = arr.reduce(function (prev, current) {
console.log("prev为%d, current为%d", prev, current);
return prev + current;
}, );
console.log(anotherSum);
从这个例子中,我们可以看出, 如果接受了第二个参数, 那么第二个参数就是作为prev的初始值,current从第一个元素开始计算。
如果没有第二个参数呢?
var anotherSum = arr.reduce(function (prev, current) {
console.log("prev为%d, current为%d", prev, current);
return prev + current;
});
console.log(anotherSum);
可以看到prev就成了数组的第一个元素, 而current是从第二个元素开始的。
注意: reduce里函数接受四个参数, prev, currentValue, currentIndex, array
6. slice和splice方法
这两个方法名十分相似,但是作用是不一样的, 我们比较常用的是slice,即截取一段,接受两个参数,第一个为开始的index, 第二个为结束的index + 1
var arr = [,,,];
console.log(arr.slice(,)); // [78, 89]
而splice方法更为强大一些, 它接受三个参数,第一个是开始的位置,第二个是从开始的位置要删除的元素个数,第三个是添加的元素 。
var arr = [,,,];
arr.splice(,,);
console.log(arr); //[45, 888, 89, 56]
arr.splice(,,,,);
console.log(arr); //[45, 456, 789, 123, 56]
7. join()、reverse()、sort()、concat()
这几个方法都比较常用,应当熟练掌握。
8. push()、pop()、shift()、 unshift()
这几个方法是添加和删除元素的,也应该熟练掌握。
9. toString() 和 toLocaleString()
即转化为字符串。
10. indexOf() 和 lastIndexOf()
这两个方法可以返回某一个元素的index。
var arr = [,,,];
console.log(arr.indexOf()); //
11. Array.isArray() 和 Object.prototype.toString.call();
这两个方法可以判断是否是数组,当然也可以使用splice等方法看看某个变量是否具有这些方法来判断他们是否是数组。
12、 includes()
这个方法是ES7中的方法,用于判断数组中是否包含某个元素。
算法
1、数组去重
(1)使用includes方法实现,这种方法非常简单,直接先建立一个数组,然后arr.forEach() ,数组能用forEach就用forEach(函数式编程),最后,我们再通过是否包含(includes)来确定是否push到res数组中。
function quchong(arr) {
var res = [];
arr.forEach(function (item) {
if (!res.includes(item)) {
res.push(item);
}
});
return res;
}
(2)、 使用对象key来去重。
function quchong(arr) {
var res = [];
var obj = {};
arr.forEach(function (item) {
if (!obj[item]) {
obj[item] = ;
res.push(item);
}
});
return res;
}
这种方式还是比较套路的,即给一个对象,把我们希望去重的元素设置为对象的属性,开始 obj[元素] 一定是undefinded,然后,我们就给他赋值,这样就相当于已经标记了它的存在,后面就不需要了。
遍历方式 && 数组方法 && 算法的更多相关文章
- jquery $.each遍历json数组方法
<!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "http://www.w3.org/ ...
- 【转】 jquery遍历json数组方法
$(function () { var tbody = ""; //------------遍历对象 .each的使用------------- //对象语法JSON数据格式(当服 ...
- 大数据学习day13------第三阶段----scala01-----函数式编程。scala以及IDEA的安装,变量的定义,条件表达式,for循环(守卫模式,推导式,可变参数以及三种遍历方式),方法定义,数组以及集合(可变和非可变),数组中常用的方法
具体见第三阶段scala-day01中的文档(scala编程基础---基础语法) 1. 函数式编程(https://www.cnblogs.com/wchukai/p/5651185.html): ...
- Collection、Map、数组 遍历方式
结论:无论是数组还是Collection for each 都是一个非常好的选择 一.for each底层实现 对于Collection,for each是隐式调用Iterator实现的,效率比显示调 ...
- JS几种数组遍历方式以及性能分析对比
前言 这一篇与上一篇 JS几种变量交换方式以及性能分析对比 属于同一个系列,本文继续分析JS中几种常用的数组遍历方式以及各自的性能对比 起由 在上一次分析了JS几种常用变量交换方式以及各自性能后,觉得 ...
- 遍历php数组的几种方法
第一.foreach() foreach()是一个用来遍历数组中数据的最简单有效的方法. <?php $urls= array('aaa','bbb','ccc','ddd'); foreach ...
- JS 中的数组遍历方式效率比较
JS数组遍历,基本就是for,forin,foreach,forof,map等等一些方法,以下介绍几种本文分析用到的数组遍历方式以及进行性能分析对比 第一种:普通for循环 代码如下: ; j < ...
- Java 中数组的遍历方式
数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同. Java 语言中提供的数组是用来存储固定大小的同类型元素. 今天我们就来说一下在java中遍历数组都有哪几 ...
- JS几种数组遍历方式总结
JS数组遍历的几种方式 JS数组遍历,基本就是for,forin,foreach,forof,map等等一些方法,以下介绍几种本文分析用到的数组遍历方式以及进行性能分析对比 第一种:普通for循环 代 ...
随机推荐
- 在iis7.5上部署asp.net mvc5
部署mvc5跟部署mvc4是一样的,唯一不同的是需要修改一下web.config的配置 在web.config中加入一下节点即可 <system.webServer> <module ...
- SQL Server Profiler (SQl跟踪器)的简单使用
一.工具介绍 在实际开发中,我们的数据库应用系统因为不可避免会存在有大量表,视图,索引,触发器,函数,存储过程,sql语句等,所以会出现一系列问题,有问题不可怕,找对工具很重要.接下来我就介绍一款性能 ...
- linux虚拟机安装mysql(Mysql-5.7.10)
注:MySQL5.5版本开始弃用了常规的configure编译方法,通过cmake来编译.需要下载安装cmake编译器.boost库.ncurses库.GNU分析器生成器bison 1. 安装基础环境 ...
- Mysql初识数据库《一》下载安装Mysql
#1.下载:MySQL Community Server 5.7.16 http://dev.mysql.com/downloads/mysql/ #2.解压 如果想要让MySQL安装在指定目录,那么 ...
- React进阶篇(1) -- react-router4模块化
本篇内容: 单一的路由无嵌套 多层嵌套路由 获取路径中的参数 按需加载 单一的路由无嵌套 routers.js import Home from 'components/Home'; import N ...
- servlet-mysql实现简单用户登录注册
环境:IDEA Maven 效果截图: 项目结构: 类说明: ConnectionUtil:负责数据库连接和释放 UserDao:数据库增删改查操作 User:用户Bean,只用注册和登录的话可以不要 ...
- springboot集成巨杉数据库
springboot倾向于约定优于配置,所以大大简化了搭建项目的流程,包括各种数据源的配置,接下来就和大家分享下最近用到的巨杉数据源连接池的配置 1.现在配置文件中定义巨杉连接池的各种连接信息,至于每 ...
- cp命令覆盖不提示
参数说明 -i, --interactive prompt before overwrite (overrides a previous -n option) #文件存在是,交互式提示是否覆盖 - ...
- 关于fatal error LINK1123:failure during conversion to COFF:file invalid or corrupt
今天用Visual Studio 2010编译postgresql工程时突然遇到下面这个编译错误: fatal error LINK1123:failure during conversion to ...
- 【离散数学】 SDUT OJ 集合的包含
集合的包含 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description 已知含n个元素的集合的子集 ...