学JS的心路历程 -数组常见处理方法
昨天我们有提到说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的心路历程 -数组常见处理方法的更多相关文章
- 学JS的心路历程-for of和for in
我们在刚入门JS时候,说到要跑出数组的每个值肯定都是这样子: var arr = [1,2,3,4,5,6]: for(let i = 0:i < arr.length:i++){ consol ...
- 学JS的心路历程-正规表达式Regular Expression
今天我们来看正规表达式,在谈到为什么需要多学这个之前,先来看个示例. 假设需要判断输入字串是否含有“apple”: var text=“A apple a day keeps the doctor a ...
- 学JS的心路历程Day26 - PixiJS -入坑
后来知道也可以透过canvas让网页动起来! 而PixiJS是使用WebGL在canvas上绘制内容与制作动态 且同时有下列特色: 支持多点触控 掩码与混合模式 可外加WebGL滤镜 多装置支持 等等 ...
- 学JS的心路历程 -物件与原型(二)
昨天有提到说Object.setPrototypeOf可以指定一个物件为另一个物件的原型,但有想过到底这个原型,也就是[[Prototype]]最终会到何处吗? 答案是Object.prototype ...
- 学JS的心路历程-Promise(三)
今天我们来说then一些特殊情况以及Promise.all()与Promise.race(). 我们都知道函式作为参数传入时,可以参照的方式传入,也能传入时执行拿回传值作使用: function us ...
- 学JS的心路历程 -函式(三)this
this是什么,取决于被呼叫的呼叫地点. 昨天有提到说,呼叫函式时候会传递隐含参数:arguments和this并讲解了arguments,今天我们就来探讨this吧! 什么是this 我们都会呼叫函 ...
- 学JS的心路历程-函式(二)arguments
参数(argument)与函式参数(parameter) 在讨论函式时,很多人都会把这两个搞混,我自己也不例外. 虽然讲错别人也听得懂,但是我们还是要搞清楚这两个的定义到底是什么! 参数是当我们呼叫函 ...
- 学JS的心路历程 - JS应用
各家电商网站都推出了各种活动和现今优惠券,当时在逛PTT时看到了有篇文章,提供代码教大家用JS的方式抢票,看了一下后发现好像很多人好奇这是怎么做的,于是就想说想一篇文章来讲解一下. 我们先来看一下折价 ...
- 学JS的心路历程Day28 - PixiJS -基础(二)
材质暂存(texture cache) 昨天有说到,图片要放入stage前,需要先把图片转成Sprite的特殊图片物件. 但是我们也可以先将图片放进材质暂存(texture cache). 什么是「材 ...
随机推荐
- python学习之----正则表达式
- jquery双击事件会触发单击事件
实际工作中,我们经常会遇到在同一个元素上,绑定多种事件类型,比较常见的是单击事件和一些鼠标事件,一般而言影响不大.但是如果同时绑定单击事件和双击事件呢? 其实,只要能够想明白的话,解决方案也比较简单, ...
- 20165205 2017-2018-2 《Java程序设计》第八周学习总结
20165205 2017-2018-2 <Java程序设计>第八周学习总结 教材学习内容总结 进程与线程 线程不是进程,但其行为很像进程,线程是比进程更小的执行单位. 与进程不同,线程的 ...
- 【3-20】html 基本知识/表格/超链接
一.HTML (一).HTML定义 HTML:是指超文本标记语言,用浏览器打开的文件 超文本标记语言:是指页面内包含文本.图片.视频.音频等元素的计算机编程语言 (二).基本格式: <html& ...
- Mybatis学习4——一对一关联查询方法2------实体作为属性
实体order和user采用resultMap order package pojo; import java.util.Date; public class Order { private Inte ...
- MFC 如何在一个窗体中嵌套在另一个窗体中
其中的一个方法是讲子窗体设置为非模式对话框,具体操作为 :设置子窗体的border属性为none,style为 child. 在父窗体中需要用create来实现,具体例子如下. 在父窗体的OnInit ...
- node.js 发送邮件
var nodemailer = require('nodemailer'); var smtpTransport = require('nodemailer-smtp-transport'); // ...
- mysql 累加求和
; SELECT temp.*,(@csum := total + @csum) as csums from ( ) as total,month(openedDate) as date from z ...
- 机器学习入门-文本数据-构造Tf-idf词袋模型(词频和逆文档频率) 1.TfidfVectorizer(构造tf-idf词袋模型)
TF-idf模型:TF表示的是词频:即这个词在一篇文档中出现的频率 idf表示的是逆文档频率, 即log(文档的个数/1+出现该词的文档个数) 可以看出出现该词的文档个数越小,表示这个词越稀有,在这 ...
- 【版本发布】JAVA微服务开发框架,Jeecg-P3 1.0.0 重构版本发布
1.项目介绍 Jeecg-P3是一个微服务框架,采用插件式模式开发:业务插件以JAR方式提供,松耦合可插拔支持独立部署,也可无缝集成Jeecg平台中,目前jeecg已经提供了在线聊天,我的邮箱等一系列 ...