做前端有多年了,看过不少技术文章,学了新的技术,但更新迭代快的大前端,庞大的知识库,很多学过就忘记了,特别在项目紧急的条件下,哪怕心中隐隐约约有学过一个方法,但会下意识的使用旧的方法去解决,多年前ES5几个新增的数组方法,好用但是常忘记用,趁着这周比较清闲,重温下并做下笔记,养成记笔记的好习惯。

forEach

forEach是ES5的Array方法中用得最频繁的一个,就是遍历,循环输出,它接受一个必须的回调函数作为参数。

let arr1 = [1,2,3,4]
arr1.forEach((item)=>{
console.info(item);
})
//
//
//
//

等同于传统的for循环。

let arr1 = [1,2,3,4]
for(let i = 1;i<arr1.length;i++){
console.info(arr1[i])
}
//
//
//
//

相比for循环,forEach简洁了很多,forEach方法中的回调函数支持3个参数,第1个是遍历的数组内容;第2个是对应的数组索引,第3个是数组本身。

[].forEach((value, index, array)=> {
});

举个例子:

let array1 = [1, 2, 3, 4]
let array2 =[]; array1.forEach( (item, index, array) => {
console.info(array1 === array);//(4)true
array2[index] = item * item;
}); console.info(array2);// [1, 4, 9, 16]

forEach除了接受一个回调函数作为参数,还接受一个可选的上下文参数(改变回调函数里面的this指向)。

array.forEach(callback,[thisObject])

例子,obj.consoleFn被调用后,this指向了obj。

let obj = {
nameArr: ["猫", "狗", "羊","鸟"],
isCat: function (name) {
return /^猫/.test(name);
},
consoleFn: function (name) {
if (this.isCat(name)) {
console.info(`你是${name}`);
} else {
console.info(`你不是${name}`);
}
}
} obj.nameArr.forEach(obj.consoleFn,obj);
// 你是猫
// 你不是狗
// 你不是羊
// 你不是鸟

下面的例子obj.consoleFn作为forEach的参数后被调用,此时如果没有指定forEach的上下文参数,那么obj.consoleFn中this指向window,会导致页面报错。这里要了解this的知识,可以查看这篇文章《javascript笔记之this用法》。

如下代码,window下并没有isCat函数,所以会出现报错。

let obj = {
nameArr: ["猫", "狗", "羊","鸟"],
isCat: function (name) {
return /^猫/.test(name);
},
consoleFn: function (name) {
if (this.isCat(name)) {
console.info(`你是${name}`);
} else {
console.info(`你不是${name}`);
}
}
} obj.nameArr.forEach(obj.consoleFn);// Uncaught TypeError: this.isCat is not a function

forEach不会遍历空元素

let array3 = [1,,3]
console.info(array3.length); //
array3.forEach((item)=>{
console.info(item);
});
//
//

map

map是ES5的Array方法中最基本的一个,其基本用法跟forEach类似,也是遍历,不同是的最终输出一个新的数组

array.map(callback,[thisObject]);

callback的参数跟forEach一样。

array.map(function(value, index, array) {
//callback需要有return值
});

map函数是把原数组被“映射”成一个新数组

let array1 = [1, 2, 3, 4]
let array2 = array1.map( (item, index, array) => {
return item * item
}); console.info(array2); // [1,4,9,16]

filter

filter为“过滤”、“筛选”之意。指数组通过filter后,返回过滤后的新数组。

array.filter(callback,[thisObject]);

filter的callback函数需要返回布尔值true或false(返回值只要是弱等于== true/false就可以了),callback需要有return值

比如,下面数组中array4的前2个组返回0和false则被过滤掉。

const array4 = [0, false, 2, 3];
const array5 = array4.filter(function(item) {
return item;
});
console.info(array5); // [2, 3]

再来一个例子,把数组中的猪过滤掉。

const array6 = ["猫", "狗", "羊", "猪"];
const array7 = array6.filter(function(item) {
if(item == '猪') return false
else return item
});
console.info(array7); // ["猫", "狗", "羊"]

some

some意指“某些”,指是否“某些项”合乎条件。用法如下:

array.some(callback,[thisObject]);

some要求至少有1个值让callback返回true就可以了,如下例子:

const arrFraction = [60, 80, 95, 70];
const passFraction = 90;//有一个人高于90分就通过入学考试 const result = arrFraction.some((item)=>{return item > passFraction
})
if(result){
console.info("通过入学考试");
}

every

every意指“每一项”,指所有必须合乎条件,只要一项不符合则返回false。用法如下:

const arrFraction = [91, 93, 95, 89];
const passFraction = 90;//所有人高于90分就通过入学考试 const result = arrFraction.every((item)=>{
return item > passFraction
})
if(result){
console.info("通过入学考试");
}else{
console.info("不通过入学考试");
}

reduce

reduce意指“缩减”,它接收一个函数作为累加器,对数组中的每个值从左到右遍历进行操作,最终计算为一个值。用法如下:

array.reduce(function(total, currentValue, currentIndex, arr), initialValue)
//total 必需。初始值, 或者计算结束后的返回值
//currentValue 必需。当前元素
//currentIndex 可选。当前元素的索引
//arr 可选。当前元素所属的数组对象。
//initialValue 可选。传递给函数的初始值,也就是total的初始值

比如,求数组项之和,初始值为0,下面代码从0开始加到6:

const arr = [1,2,3,4,5,6];

let sum = arr.reduce(function (total, currentValue) {
return total + currentValue;
},0);
console.info(sum)

比如,求数组的最小值

const arr = [20,20,35,4,15,6];

let min= arr.reduce(function (prev, cur) {
return Math.min(prev,cur);
});
console.info(min)

reduceRight

reduceRight() 方法的功能和reduce功能是一样的,不同的是遍历的顺序相反,它是从数组的最后一项开始,向前遍历到第一项

【原】javascript笔记之Array方法forEach&map&filter&some&every&reduce&reduceRight的更多相关文章

  1. js数组方法forEach,map,filter,every,some实现

    Array.prototype.map = function(fun /*, thisp*/) { var len = this.length; if (typeof fun != "fun ...

  2. ES6新增的常用数组方法(forEach,map,filter,every,some)

    ES6新增的常用数组方法 let arr = [1, 2, 3, 2, 1]; 一 forEach => 遍历数组 arr.forEach((v, i) => { console.log( ...

  3. ES6 数组方法 forEach map filter find every some reduce

    1. forEach const colors = ['red', 'blue', 'green'] colors.forEach(function (params) { console.log(pa ...

  4. 5个数组Array方法: indexOf、filter、forEach、map、reduce使用实例

    ES5中,一共有9个Array方法 Array.prototype.indexOf Array.prototype.lastIndexOf Array.prototype.every Array.pr ...

  5. ES5 的 forEach, map, filter, some, every 方法

    1:  forEacharray.forEach(callback,[ thisObject]) // 遍历数组里面的所有数字// item 是值, i 是序号, array 是整个数组 [1, 2 ...

  6. JavaScript中数组Array方法详解

    ECMAScript 3在Array.prototype中定义了一些很有用的操作数组的函数,这意味着这些函数作为任何数组的方法都是可用的. 1.Array.join()方法 Array.join()方 ...

  7. js Array 中的 map, filter 和 reduce

    原文中部分源码来源于:JS Array.reduce 实现 Array.map 和 Array.filter Array 中的高阶函数 ---- map, filter, reduce map() - ...

  8. 数组的新方法 forEach some filter findIndex

    forEach  some  filter  findIndex这些都属于数组的新方法,都会对数组中的每一项,进行遍历,执行相关的操作: 只不过在循环的时候有些不一样 参考资料:https://wan ...

  9. 处理数组的forEach map filter的兼容性

    处理数组的forEach //forEach处理 if(!Array.prototype.forEach) { Array.prototype.forEach = function (callback ...

随机推荐

  1. 妙用this关键字

    妙用this关键字 ## this关键字一般this关键字都是指的是对象的本身,在类的所有方法.构造器都可以拿到this引用,这是jvm"偷偷"帮我们传递进来的引用,指向调用方法对 ...

  2. C++内存深入理解

    转载地址:http://www.cnblogs.com/DylanWind/archive/2009/01/12/1373919.html 前部分原创,转载请注明出处,谢谢! class Base  ...

  3. 【转】javascript 分号问题

    javascript的分号代表语句的结束符,但由于javascript具有分号自动插入规则,所以它是一个十分容易让人模糊的东西,在一般情况下,一个换行就会产生一个分号,但实际情况却不然,也就是说在ja ...

  4. CSS命名规则常用的css命名规则

    CSS命名规则常用的css命名规则 头:header 内容:content/container 尾:footer 导航:nav 侧栏:sidebar 栏目:column 页面外围控制整体布局宽度:wr ...

  5. css 实现文字自动换行切同行元素高度自适应

    1.实现div行内布局所有行跟随最大高度自适应 html代码样例: <div class="row-single"> <div class="colsp ...

  6. Python_跟随目标主机IP变换

    ''' 为了防止黑客攻击或者负载均衡,会经常变换主机,这样同一个域名在不同时间可能会对应不同的IP地址,在这种情况下可以通过 socket模块的gethostbyname()函数来实时获取目标主机的I ...

  7. macbook 添加快捷启动服务

    来至 Mac OS X: Launch Terminal from keyboard shortcut os x 上很多功能都可以通过Apple自家的Automator.app创建,且使用此方法可以为 ...

  8. activemq的消息确认机制ACK

    一.简介 消息消费者有没有接收到消息,需要有一种机制让消息提供者知道,这个机制就是消息确认机制. ACK(Acknowledgement)即确认字符,在数据通信中,接收站发给发送站的一种传输类控制字符 ...

  9. 关于java多线程关键字volatile的理解

    volatile关键字的作用是强制从公共堆栈中取得变量的值,而不是从线程私有数据栈中取得变量的值. 使用volition关键字增加了实例变量在多个线程间的可见性.但volition有个致命的缺点就是不 ...

  10. Java生成名片式的二维码源码分享

    世界上25%的人都有拖延症——但我觉得这统计肯定少了,至少我就是一名拖延症患者.一直想把“Java生成名片式(带有背景图片.用户网络头像.用户昵称)的二维码”这篇博客分享出来,但一直拖啊拖,拖到现在, ...