foreach和map的区别(map和forEach)

http://www.itjxue.com  2023-01-30 09:32  来源:未知  点击次数: 

scala中map和foreach的区别

Scala中的集合对象都有foreach和map两个方法。两个方法的共同点在于:都是用于遍历集合对象,并对每一项执行指定的方法。而两者的差异在于:foreach无返回值(准确说返回void),map返回集合对象。见如下代码及运行结果:b.getClass 得到的是void, 而c.getClass得到的是colletion 。再看代码的第9-11行,foreach和map的运行结果一致。结论就是:foreach 无法代替map. 而map方法却可以代替foreach。

问题:为什么scala提供foreach和map两个方法呢?本人看法是scala做为一种支持函数式编程范式的语言,必然要引入一种机制以支持数学中函数概念,而在数学中函数就是映射,所以scala中有map方法一点都不奇怪。而foreach只是用在不需要对集合执行映射操作,但需要遍历集合时才用到。总而言之,foreach用于遍历集合,而map用于映射(转换)集合到另一个集合。

[java]?view plain?copy

object?arrayTest?extends?App{

var?increase=(x:Int)=x+1

val?someNumbers?=?List?(?-11,?-10,?-?5,?0,?5,?10)

var?b?=?someNumbers.foreach(increase)

println(b.getClass)

var?c?=?someNumbers.map(increase)

println(c.getClass)

c.foreach((x:Int)=print(x+"?"))

println()

c.map((x:Int)=print(x+"?"))

}

map()和forEach()

forEach()方法中的function回调支持三个参数,第一个是遍历的内容,第二个是索引,第三个是数组本身。即

这里的map是“映射”的意思,基本用法跟forEach类似,但是可以把原数组映射成一个新的数组。比如:

支持return返回值,return的是啥,相当于把数组的这一项变成啥。

1、map速度比forEach快。

2、map会返回一个新数组,不会对原数组产生影响;而forEach不会产生新的数组,只会返回endefined。

3、map因为返回数组,所以可以进行链式操作。

4、map里可以用return,forEach不能;forEach不能用break。

forEach和map有什么区别

map是循环一个数组然后返回一个值组成新的数组;1[1,2,3].map(function(v){return v*v}); //返回[1,4,9]forEach只是循环数组,无返回值(相当于for循环);reduce是循环一个数组,然后组合成一个值1[1,2,3].reduce(function(prv,v){return prev+v}); //返回6

JS的forEach和map方法的区别,还有一个$each

forEach()和map()两个方法都是ECMA5中Array引进的新方法,主要作用是对数组的每个元素执行一次提供的函数,但是它们之间还是有区别的。jQuery也有一个方法$.each(),长得和forEach()有点像,功能也类似。但是从本质上还是有很大的区别的,那么我们探探究竟。

一、forEach和map语法

语法:

//forEach

array.forEach(callback(currentValue, index, array){

//do something

}, this)

//或者

array.forEach(callback(currentValue, index, array){

//do something

})

//map:

var new_array = arr.map(callback[, thisArg]) 

//$.each()

$(selector).each(function(index,element)) //注意参数的顺序

callback: 为数组中每个元素执行的函数,该函数接收三个参数,

参数一:当前数组中元素;参数二:索引; 参数三:当前数组。

this:可选,执行会掉时候,this的指向。

二、区别

2.1、forEach()返回值是undefined,不可以链式调用。

2.2、map()返回一个新数组,原数组不会改变。

2.3、没有办法终止或者跳出forEach()循环,除非抛出异常,所以想执行一个数组是否满足什么条件,返回布尔值,可以用一般的for循环实现,或者用Array.every()或者Array.some();

2.4、$.each()方法规定为每个匹配元素规定运行的函数,可以返回 false 可用于及早停止循环。

三、经典例子

3.1 在使用forEach()时候,如果数组在迭代的视乎被修改,

则其他元素会被跳过。因为 forEach()不会在迭代之前创建数组的副本。

3.2反转字符串

var str = '12345';

Array.prototype.map.call(str, function(x) { //同时利用了call()方法

return x;

}).reverse().join('');

3.3一个笔试题。

1

["1", "2", "3"].map(parseInt); //结果 [1, NaN, NaN] 

如果想得到[1, 2,3]应该这么做

function returnInt(element){

return parseInt(element,10);

}

["1", "2", "3"].map(returnInt);

这主要是因为 parseInt()默认有两个参数,第二个参数是进制数。当parsrInt没有传入参数的时候,而map()中的回调函数时候,会给它传三个参数,第二个参数就是索引,明显不正确,所以返回NaN了。

3.4....

四、兼容性

forEach()和map()是ECMA5新引入的,可能在标准的其他实现中不存在,在使用前可以要Ployfill一下。

具体网上很多吧,更多的是在ie9以下,如果你的项目无视这些,那么你可以不care。

map和forEach的区别和用法

相同:forEach和map方法里每次执行匿名函数都支持3个参数,参数分别是item-当前项,index当前项索引值,array原数组;

不同:

map

1.map方法返回一个新的数组,数组中的元素为原始数组调用函数处理后的值。

2.map方法不会对空数组进行检测,若arr为空数组,则map方法返回的也是一个空数组,map方法不会改变原始数组。

3.浏览器支持:chrome、Safari1.5+、opera都支持,IE9+

运行结果

forEach

1.forEach方法用来调用数组的每个元素,将元素传给回调函数

2.forEach对于空数组是不会调用回调函数的,即没有返回值。

运行结果

性能上来说forforEachmap

但是选用方法时不用太过考虑性能,一般简单遍历用forEach,对会产生有规律的变化的新数组时用map

(责任编辑:IT教学网)

更多

推荐安全技术文章