ECMAScript 5中对Array中新增了9个方法
ECMAScript 5中对Array中新增了9个方法:
- 5个迭代方法(循环操作数组中的各个项):forEach(),map(),filter(),every()和some()
- 2个归并方法(迭代数组所有项,最终返回一个值):reduce()和reduceRight()
- 2个索引方法:indexOf()和lastIndexOf()
forEach(callbackFn[,thisArg])
遍历数组一次对数组中的各个项,依次执行 callbackFn 函数,第二个可选参数则可以为这个 callbackFn 指定执行上下文。
[1, 2 ,3, 4].forEach(alert);
以上代码等同于
var array = [1, 2, 3, 4];
for (var k = 0, length = array.length; k < length; k++) {
alert(array[k]);
}
delete array[1]; // 移除 2
alert(array.length); // but the length is still 3
array.forEach(alert); // 依次弹出1、3、4
alert(array) // 1,,3,4
array[7] = 8;
alert(array.length); // 长度变为8
array.forEach(alert); // 依次弹出1、3、4、8
以上我们知道 forEach 不会循环 delete 掉的值
在这个 callbackFn 里可以使用三个参数:数组对象、元素索引以及数组本身,完整实例如下:
var sum = 0;
[1, 2, 3, 4].forEach(function (item, index, array) {
console.log(array[index] == item); // true
sum += item;
});
alert(sum); // 10
而 forEach()中的第二个参数可以改变执行上下文,实例如下:
var database = {
users: ["Dmitry", "John", "David"],
sendEmail: function (user) {
if (this.isValidUser(user)) {
/* sending message */
}
},
isValidUser: function (user) {
/* some checks */
}
};
// send an email to every user
database.users.forEach( // 在database数组内循环
database.sendEmail,
database // 使 database 对象为了执行上下文对象
);
forEach实现break功能
forEach()无法像for循环那样使用相应的break语句。在《javascript权威指南》中给出将forEach()方法放在try模块中,如能抛出异常,则会提前终止。
var array = [1, 2, 3];
function foreach(a, f, t){
try {
a.forEach(f, t);
} catch (e) {
if ( e === foreach.break ) return;
else throw e;
}
}
foreach.break = new Error('stop')
foreach(array, function(v, i, a){
console.log(v)
if ( v > 1 ) {
foreach.break;
} else {
a[i] = 0;
}
})
console.log(array) // [0, 2 , 3]
此外还可以使用变量开关,以及修改数组的方法,但是最完美的是使用以下要说到的 every 或者 some 方法
map(callbackfn[thisArg])
map()方法参数跟forEach()方法一样,此方法依次对数组中的各个元素引用callback函数,返回元素为函数结果的新的数组。
如下事例:
var arr1 = ['一','二','三','四','五','六'];
var arr2 = arr1.map(function(value, index){
return index+1;
})
console.log(arr2) // [1, 2, 3, 4, 5, 6]
ps:callbackfn 需要return ,不然数组内所有项都是 underfined
项目应用中,我们可以利用map很方便获得数组中的一些特定属性值
var users = [
{name: "Dmitry", "email": "dmitry@email.com"},
{name: "John", "email": "john@email.com"},
{name: "David", "email": "david@email.de"},
// etc
];
var emails = users.map(function (user) { return user.email; }); alert(emails); // ["dmitry@email.com", "john@email.com", "david@email.de"]
fliter(callbackfn[thisArg])
fliter()参数跟forEach()方法也一样,此方法依次对数组中的各个元素应用 callback 函数,并返回函数的返回值为 true 的元素所组成的新的数组。
接着以上 map 第一个事例,我们将筛选出数组中的偶数项目
var arr3 = arr2.filter(function(e){
return e % 2 === 0
})
console.log(arr3) //[2,4,6]
ps:返回值只要弱等于== true/false而非强等于=== true/false
some(callbackfn[thisArg])
some()方法跟forEach()方法参数是一样的,此方法依次对数组中的各个元素应用 callback 函数。如果 callback 函数的结果为true,则终止。
var found = null; var points = [
{x: 10, y: 20},
{x: 15, y: 53},
{x: 17, y: 72}
]; points.some(function (point) { if (point.x > 10 && point.y < 60) {
found = point; // found
return true;
} return false; }); if (found) {
alert("Found: " + found.x + ", " + found.y); // Found: 15, 53
}
every(callbackfn[thisArg])
every()依次对数组中的各个元素应用 callback 函数。在 callback 返回false后终止。
跟some()的区别就是:some是找出 true 的那一样,而every则是找出 false的那一项。可以理解为 some() 要找出对的,二 every() 要找出错的。
every()方法也我们这里要介绍的数组迭代方法中的最后一个方法了,此方法参数还是跟其他迭代方法一样。
function isQualified(element, index, array) {
return (element >= 60);
}
console.log([61, 59, 81, 99, 44].every(isQualified)) // false
console.log([92, 74, 78, 88, 66].every(isQualified)) // true
reduce(callbak[, initialValue])
reduce()将数组的各个元素与之前的函数调用结果作为参数,依次调用 callback 函数,并返回函数调用的最终结果。
callbak 函数接受4个参数:前值,当前值,索引值,以及数组本身。initialValue 参数可选,表示初始值。若指定则当作第一次调用时的前值;如果没有,则使用数组的第一个元素作为前值,数组的第二个元素则是当前值。其实就是有 initialValue 比没有 initialValue 少一次操作。
var sum = [1, 2, 3, 4].reduce(function (previous, current, index, array) {
return previous + current;
},0);
console.log(sum); // 10 以上 initialValue 为 0 跟 不设置 initialValue 结果相同
var product = [1, 2, 3, 4].reduce(function (previous, current, index, array) {
return previous * current;
},1)
console.log(product) // 24 以上 缺省值 为 1 跟不设置 initialValue 结果相同
使用 reduce() 方法我们可以很轻松的将二维数组合并为一维数组:
var matrix = [
[1, 2],
[3, 4],
[5, 6]
]; alert(matrix[0][1]); // 2 // and now get the flatten array var flatten = matrix.reduce(function (previous, current) {
return previous.concat(current);
}); alert(flatten); // [1, 2, 3, 4, 5, 6]
reduceRight(callbak[, initialValue])
从数组末尾开始向前执行 reduce 操作。
indexOf(searchElement, [fromIndex])
返回第一个与 searchElement 一致的元素下标。也可以通过第2个参数来设置检索的起始下标。如果没有找到相符的结果,则返回-1
其实跟字符串的 indexOf 方法类似。
var data = [2, 5, 7, 3, 5]; alert(data.indexOf(5)); // 1
alert(data.indexOf(5, 3)); // 4 (start search from 3 index) alert(data.indexOf(4)); // -1 (not found)
alert(data.indexOf("5")); // -1 (also not found since 5 !== "5")
lastIndexOf(searchElement, [fromIndex])
从后向前检索,返回第一个与 searchElement 一直的元素的下标。也可以通过第二个参数来设置检索的起始下标。如果没有找到则返回-1
var data = [2, 5, 7, 3, 5]; alert(data.lastIndexOf(5)); // 4
alert(data.lastIndexOf(5, 3)); // 1 (start search from 3 index) if (data.indexOf(4) == -1) {
alert("4 is not found");
}
Es5很多IE9以下浏览器都不支持,所以我们在低于IE9的浏览器中加入 es5-shim
原地址:http://www.html5jscss.com/es5-array-method.html
ECMAScript 5中对Array中新增了9个方法的更多相关文章
- python 中 numpy array 中的维度
简介 numpy 创建的数组都有一个shape属性,它是一个元组,返回各个维度的维数.有时候我们可能需要知道某一维的特定维数. 二维情况 >>> import numpy as np ...
- 关于ECMAScript 2016, 2017, 和2018中新增功能(摘抄)
ECMAScript 2016 1. Array.prototype.includes includes是数组上的简单实例方法,并有助于轻松查找某个项是否在Array中(包括NaN不像indexOf) ...
- JavaScript中的Array数组详解
ECMAScript中的数组与其他多数语言中的数组有着相当大的区别,虽然数组都是数据的有序列表,但是与其他语言不同的是,ECMAScript数组的每一项可以保存任何类型的数据.也就是说,可以用数组的第 ...
- 详解Javascript中的Array对象
基础介绍 创建数组 和Object对象一样,创建Array也有2种方式:构造函数.字面量法. 构造函数创建 使用构造函数的方式可以通过new关键字来声明,如下所示: 12 var arr = new ...
- ES5新特性:理解 Array 中增强的 9 个 API
为了更方便的对JS中Array进行操作,ES5规范在Array的原型上新增了9个方法,分别是forEach.filter.map.reduce.reduceRight.some.every.index ...
- JavaScript中数组Array方法详解
ECMAScript 3在Array.prototype中定义了一些很有用的操作数组的函数,这意味着这些函数作为任何数组的方法都是可用的. 1.Array.join()方法 Array.join()方 ...
- 了解PHP中的Array数组和foreach
1. 了解数组 PHP 中的数组实际上是一个有序映射.映射是一种把 values 关联到 keys 的类型.详细的解释可参见:PHP.net中的Array数组 . 2.例子:一般的数组 这里,我 ...
- 转OSGchina中,array老大的名词解释
转OSGchina中,array老大的名词解释 转自:http://ydwcowboy.blog.163.com/blog/static/25849015200983518395/ osg:: Cle ...
- C#中数组Array、ArrayList、泛型List<T>的比较
在C#中数组Array,ArrayList,泛型List都能够存储一组对象,但是在开发中根本不知道用哪个性能最高,下面我们慢慢分析分析. 一.数组Array 数组是一个存储相同类型元素的固定大小的顺序 ...
随机推荐
- Java-小技巧-004-jdk时间,jdk8时间,joda,calendar,获取当前时间前一周、前一月、前一年的时间
1.推荐使用java8 localdate等 线程安全 支持较好 地址 2.joda 一.简述 查看SampleDateFormat源码,叙述有: * Date formats are not syn ...
- Spring源码解析(一)开篇
前言 Spring源码继承结构比较复杂,看过以后经常会忘记.因此,记录一下源码分析的过程,方便以后回顾.本次分析的Spring源码版本为3.2.15. 另外,一提Spring就是IOC.DI等等,我们 ...
- JavaWeb—Session与Cookie
概念 会话:指从一个浏览器窗口打开到关闭期间的一系列动作(可简单理解为用户开一个浏览器,点击多个链接,访问服务器多个web资源,然后关闭浏览器). HTTP协议是无状态协议:每次连接(比如同一个网站的 ...
- java 多线程 day12 读写锁
import java.util.Random;import java.util.concurrent.locks.ReadWriteLock;import java.util.concurrent. ...
- 我的Linux病毒追踪记录
第一次自己一个人全权负责做游戏服务器,对于Linux安全并不太懂,所以就在昨天,服务器遭到了攻击,刚开始,只是发现服务器的带宽占满了,以为是带宽不够用,可是想想,弱联网游戏对带宽占用也不高啊而且带宽加 ...
- 以About Us为范例在Zen cart中增加页面
1.在includes\languages\english\html_includes目录中新建文件define_about_us.php 2.在includes\templates\Your_tem ...
- 【android】activity的4种启动模式简介
首先咱必须知道,activity是以栈(后进先出)的结构进行管理的. 当活动A启动了活动B时,A被压入到栈内,B在栈的最顶层.当B调用finish()结束活动时,B从栈弹出,此时A在栈的最顶层. 我们 ...
- 关于bootstrap插件datepicker
<input readonly size="16" type="text" name="time" id="time&q ...
- spark程序设计
Spark程序设计—创建RDD:从Scala集合构造成RDD parallelize(a, 3) makeRDD(a, 3) 他俩使用方式一样,只不过名字不一样 Spark程序设计—创建RDD:本地文 ...
- window连接linux共享
前提说明:windows主机信息:192.168.1.100 帐号:abc 密码:123 共享文件夹:sharelinux主机信息:192.168.1.200 帐号:def 密码:456 共享文件夹: ...