1.背景介绍
在js语言中,数组对象(即Array类型)是一种非常常用的类型,ECMAScript数组的每一项可以保存任何类型的数据。
数组对象的方法有很多:“转换方法”、“栈方法”、“队列方法”、“重排序方法”、“操作方法”、“迭代方法”等。
这次就针对“迭代方法”的内容进行介绍。
2.知识剖析
迭代方法
filter()、some()、map()、forEach()
每个方法都接收两个参数:
1、要在每一项上运行的函数。
2、运行该函数的作用域对象—this(可选)。
array.filter(function () {
//do your staff here;
}, this);
传入这些方法中的函数参数本身会接收三个参数:
1、数组项的值;
2、该项在数组中的位置;
3、数组对象本身;
array.forEach(function (item, index, array) {
//do your staff here;
}, this);
对一个数组 filter、some、map、foreach的操作分别有什么作用
filter():对数组中的每一项运行给定函数,返回该函数会返回true 的项组成的数组。
some():对数组中的每一项运行给定函数,如果该函数对任一项返回true,则返回true。
map():对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组。
forEach():对数组中的每一项运行给定函数。这个方法没有返回值。
例子 一
var arr = [1,2,3,4,5];
console.log(arr.filter(function (item,index,array) {
console.log('item='+item+',index='+index+',array='+array);
return item>2;
}));
filter() 把原数组arr每一项返回为true的项,重新组成数组,并打印出该数组每个索引的值和数组长度。
例子二
var arr = [1,2,3,4,5];
console.log(arr.some(function (item,index,array) {
console.log('item='+item+',index='+index+',array='+array);
return item>2;
}));
some() ,在遍历数组项的时候,当第一个满足函数体的项出现,就直接返回true,并且不再执行后面的迭代。
例子三
var arr = [1,2,3,4,5];
console.log(arr.map(function (item,index,array) {
console.log('item='+item+',index='+index+',array='+array);
return item>2;
}));
map() 把原数组arr的每一项迭代返回的结果,重新组成数组,并打印出该数组每个索引的值和数组长度。
例子四
var arr = [1,2,3,4,5];
console.log(arr.forEach(function (item,index,array) {
console.log('item='+item+',index='+index+',array='+array);
return item>2;
}));
forEach():对数组中的每一项运行给定函数,这个方法并没有返回值。 forEach() ,只是对每个数组项运行指定的函数体,这个迭代方式并没有返回值。
3.常见问题
4.解决方案
5.编码实战
6.扩展思考
7.参考文献
Js 数组——filter()、map()、some()、every()、forEach()、lastIndexOf()、indexOf()
8.更多讨论
问题一 相对于for(),JS数组自定义的数组迭代方式有哪些好处?
答:在实现相同功能的前提下,后者除了能够节省代码量外,在实现某些功能上的流程中存在很多有意思的优势,比如forEach相比普通的for循环的优势在于对稀疏数组的处理,会跳过数组中的空位。for+i在性能测试上是优越于后者,但是前提是,array的length要事先计算出来,而在处理非常大量的数据时候,后者的优势就显而易见了。
问题二 参数item、index和array代表的是什么?
答:传入这些方法中的函数会接收三个参数,item表示遍历后的当前对象,里面的index代表当前循环到第几个索引,array代表数组对象本身。
问题三 迭代和遍历、循环、递归有什么区别?
答:循环(loop),指的是在满足条件的情况下,重复执行同一段代码。比如,while语句。
迭代(iterate),指的是按照某种顺序逐个访问列表中的每一项。比如,for语句。
遍历(traversal),指的是按照一定的规则访问树形结构中的每个节点,而且每个节点都只访问一次。
递归(recursion),指的是一个函数不断调用自身的行为。比如,以编程方式输出著名的斐波纳契数列。
有了以上定义,这几个概念之间的区别其实就比较清楚了。至于它们之间的联系,严格来讲,它们似乎都属于算法的范畴。
换句话说,它们只不过是解决问题的不同手段和方式,而本质上则都是计算机编程中达成特定目标的途径。