昨天我们有提到说for-of和forEach可以用来处理数组,但其实还有很多方法可以更快速及精简代码的达到你要的效果。

话不多说,我们赶紧来看吧!

Array.prototype.map()

会回传一个新数组,其值为原数组每一个值经回呼函式运算后的回传值。故新数组长度会与原数组相同。

要注意的是,如果没有回传值,会预设回传undefined。

var arr = [1,2,3,4,5,6,7,8,9];

var arrMap = arr.map((item,index,array)=>{

return item * index

})

console.log(arrMap);//[0,2,6,12,20,30,42,56,72]

map最常拿来与for和for-in作比较,有人认为我用原本的循环就可以达成了,为何还要用map呢?

那我们来比较一下两者吧:

var arr = [1,2,3,4,5,6,7,8,9];

var arrMap = arr.map((item,index,array)=>{

return item * index

})

var arrFor = [];

for(let i = 0;i < arr.length;i++){

arrFor.push(arr[i]*i)

}

虽然意思都是一样,但是今天别人看到你写for时需要思考说,这个for是在干嘛?有改动什么东西吗?

但如果是map别人一看就知道说,这是对原数组作操作并回传一个新的(cctsol)。

Array.prototype.filter()

会回传一个数组,其值为原数组每一个值经回呼函式运算后回传为true的值,故长度不一定等于原数组。

var arr = [1,2,3,4,5,6,7,8,9];

var arrFilter = arr.filter((item,index,array)=>{

return item%2 === 0;

});

console.log(arrFilter);//[2,4,6,8]

通常用于条件过滤,所以才叫做filter(过滤)。

像是过滤出不重复的数组:

var arr = ['Jason','Turtle','Chris','Jason','Kai','Chris','Henry','Kai'];

var uniquePerson = arr.filter((item,index,array)=>{

return array.indexOf(item)=== index;

});

console.log(uniquePerson);//[“Jason”,“Turtle”,“Chris”,“Kai”,“Henry”]

Array.prototype.find()

会回传第一个满足函式条件的值,否则回传undefined。

var arr = ['Jason','Turtle','Chris','Jason','Kai','Chris','Henry','Kai'];

var findPerson = arr.find((item,index,array)=>{

return item === 'Chris';

});

console.log(findPerson);

Array.prototype.every()

会回传数组是否每一个值都满足函式的条件。

var arr = [{

name:“Jason”,

age: 29

},

{

name:“Chris”,

age: 31

},

{

name:“Kai”,

age: 24

},

{

name:“Henry”,

age: 24

}

];

var checkAge = arr.every((item,index,array)=>{

return item.age > 10;

});

console.log(checkAge);//true

var test = arr.every((item,index,array)=>{

return item.age < 30;

});

console.log(test);//false

Array.prototype.some()

跟every用法很像,差别在于只要部分符合及回传true。

var arr = [{

name:“Jason”,

age: 29

},

{

name:“Chris”,

age: 31

},

{

name:“Kai”,

age: 24

},

{

name:“Henry”,

age: 24

}

];

var test = arr.some((item,index,array)=>{

return item.age < 30;

});

console.log(test);//true

Array.prototype.reduce()

会将数组内每一个值经回呼函式运算后回传单一个值。

这个方法很特别的是每一次呼叫可以跟前一个回传值作再次运算并回传。

accumulator用来累积回呼函式回传值的累加器,是上一次呼叫后,所回传的累加数值。

currentValue是当前数组的值

currentIndex当前数组值的索引(可选)

array原本的数组(可选)

var arr = [1,2,3,4,5,6,7,8,9,10];

var sum = arr.reduce((accumulator,item)=>{

return accumulator + item;

});

console.log(sum);

在这边要注意到reduce有个很特别的参数initialValue初始值,若没有提供初始值,原数组的第一个元素将会被当作初始的累加器。

var arr = [1,2,3,4,5,6,7,8,9,10];

var sum = arr.reduce((accumulator,item)=>{

console.count(accumulator,item);

return accumulator + item;

},0);

console.log(sum);

可以跟上一个例子作比较,会发现没有提供initialValue,会少运算一次喔(aichi-kaigo)!

以上是今天的数组常见处理方法,下次要对数组作操作时不要一开始就用for,试着用这先简单明了的方法吧!

学JS的心路历程 -数组常见处理方法的更多相关文章

  1. 学JS的心路历程-for of和for in

    我们在刚入门JS时候,说到要跑出数组的每个值肯定都是这样子: var arr = [1,2,3,4,5,6]: for(let i = 0:i < arr.length:i++){ consol ...

  2. 学JS的心路历程-正规表达式Regular Expression

    今天我们来看正规表达式,在谈到为什么需要多学这个之前,先来看个示例. 假设需要判断输入字串是否含有“apple”: var text=“A apple a day keeps the doctor a ...

  3. 学JS的心路历程Day26 - PixiJS -入坑

    后来知道也可以透过canvas让网页动起来! 而PixiJS是使用WebGL在canvas上绘制内容与制作动态 且同时有下列特色: 支持多点触控 掩码与混合模式 可外加WebGL滤镜 多装置支持 等等 ...

  4. 学JS的心路历程 -物件与原型(二)

    昨天有提到说Object.setPrototypeOf可以指定一个物件为另一个物件的原型,但有想过到底这个原型,也就是[[Prototype]]最终会到何处吗? 答案是Object.prototype ...

  5. 学JS的心路历程-Promise(三)

    今天我们来说then一些特殊情况以及Promise.all()与Promise.race(). 我们都知道函式作为参数传入时,可以参照的方式传入,也能传入时执行拿回传值作使用: function us ...

  6. 学JS的心路历程 -函式(三)this

    this是什么,取决于被呼叫的呼叫地点. 昨天有提到说,呼叫函式时候会传递隐含参数:arguments和this并讲解了arguments,今天我们就来探讨this吧! 什么是this 我们都会呼叫函 ...

  7. 学JS的心路历程-函式(二)arguments

    参数(argument)与函式参数(parameter) 在讨论函式时,很多人都会把这两个搞混,我自己也不例外. 虽然讲错别人也听得懂,但是我们还是要搞清楚这两个的定义到底是什么! 参数是当我们呼叫函 ...

  8. 学JS的心路历程 - JS应用

    各家电商网站都推出了各种活动和现今优惠券,当时在逛PTT时看到了有篇文章,提供代码教大家用JS的方式抢票,看了一下后发现好像很多人好奇这是怎么做的,于是就想说想一篇文章来讲解一下. 我们先来看一下折价 ...

  9. 学JS的心路历程Day28 - PixiJS -基础(二)

    材质暂存(texture cache) 昨天有说到,图片要放入stage前,需要先把图片转成Sprite的特殊图片物件. 但是我们也可以先将图片放进材质暂存(texture cache). 什么是「材 ...

随机推荐

  1. Java - 32 Java 多线程编程

    Java 多线程编程 Java给多线程编程提供了内置的支持.一个多线程程序包含两个或多个能并发运行的部分.程序的每一部分都称作一个线程,并且每个线程定义了一个独立的执行路径. 多线程是多任务的一种特别 ...

  2. SQL Server 2016:内存列存储索引

    作者 Jonathan Allen,译者 谢丽 SQL Server 2016的一项新特性是可以在“内存优化表(Memory Optimized Table)”上添加“列存储索引(Columnstor ...

  3. android开发 静态碎片布局实现

    实现思维: 1.需要写2个或者多个子布局 2.写一个Java的class去实现将子布局与父类布局铺满.(一个子布局对应一个class) 3.在父类布局中导入fragment布局,并且添加android ...

  4. centos7安装LNMP与Laravel遇到的一些小问题

    安装LNMP 第一次安装 yum update CentOS7下 Nginx1.13.5 + PHP7.1.10 + MySQL5.7.19 源码编译安装 安装mySQL时,mysqld: error ...

  5. ELK学习博客

    ELK实时日志分析平台环境部署--完整记录 https://www.cnblogs.com/kevingrace/p/5919021.html

  6. PostgreSQL (简称gp)小集

    1. SQLyog & Navicat SQLyog可以管理 MySQL Navicat 可以管理 SQL Server,MySQL,PostgreSQL,SQLite 2. 日期及加减 no ...

  7. Android呼吸灯效果实现

    最近需要做一个搜索动画的呼吸灯效果,在网上查了下有以下两种实现方式,现记录下来. 实现呼吸灯效果本质上都是使用ImageView动画,实现alpha值变化. 第一种方式,直接使用动画实现,代码如下: ...

  8. 分享给大家一个500G.Net ftp资料库

    把自己经常用到的一个ftp资料库分析给大家,大家可以到上面下载资料学习,资料比较齐全,另外还有部分工具, ftp的地址是:ftp://202.107.251.26

  9. asp.net excel导出去除科学计数法的表示格式

    去除导出excel中的科学计数法的表示格式:在td标签里面加个样式:style=\"vnd.ms-excel.numberformat:@\" <td style=\&quo ...

  10. 白鹭引擎 - 本地坐标和舞台坐标的转化 ( globalToLocal, localToGlobal )

    class Main extends egret.DisplayObjectContainer { /** * Main 类构造器, 初始化的时候自动执行, ( 子类的构造函数必须调用父类的构造函数 ...