如何形象地解释 JavaScript 中 map,foreach,reduce 间的区别
展开全部
forEach: 对数组中每一个元素都运行函数,该方法没有返回值。如果你想对数据里的每一个元素进行处理,可以采用forEach来替换 for循环
map:对数组中每一个元素都运行函数, 返回由每次函数执行的结果组成的数组。果你想对数据里的每一个元素进行处理,可以采用forEach来替换 for循环,和forEach不同的是,它最终会返回一个新的数组,数组的元素是每次处理先前数组中元素返回的结果
reduce: 对数组中的所有元素调用指定的回调函数。 该回调函数的返回值为累积结果,并且此返回值在下一次调用该回调函数时作为参数提供。
还是看例子来理解吧:
var arr3 = [1,2,9,5,4];
// 数组中每个元素都要翻10倍
var arr4 = arr3.map(function(ele,index,arr2) {
return ele*10;
});
console.log(arr4.toString()); //10,20,90,50,40
arr3.forEach(function(ele,index,arr){
console.log("模拟插入元素到数据库:"+ele);
});
打印结果:
模拟插入元素到数据库:1
模拟插入元素到数据库:2
模拟插入元素到数据库:9
模拟插入元素到数据库:5
模拟插入元素到数据库:4
reduce的测试例子:
// Define the callback function.
function appendCurrent (previousValue, currentValue) {
return previousValue + "::" + currentValue;
}
// Create an array.
var elements = ["abc", "def", 123, 456];
// Call the reduce method, which calls the callback function
// for each array element.
var result = elements.reduce(appendCurrent);
document.write(result);
// Output:
// abc::def::123::456
展开全部
假设我们有一个数组,每个元素是一个人。你面前站了一排人。
foreach 就是你按顺序一个一个跟他们做点什么,具体做什么,随便:
people.forEach(function (dude) {
dude.pickUpSoap();
});
map 就是你手里拿一个盒子(一个新的数组),一个一个叫他们把钱包扔进去。结束的时候你获得了一个新的数组,里面是大家的钱包,钱包的顺序和人的顺序一一对应。
var wallets = people.map(function (dude) {
return dude.wallet;
});
reduce 就是你拿着钱包,一个一个数过去看里面有多少钱啊?每检查一个,你就和前面的总和加一起来。这样结束的时候你就知道大家总共有多少钱了。
var totalMoney = wallets.reduce(function (countedMoney, wallet) {
return countedMoney + wallet.money;
}, 0);
补充一个 filter 的:
你一个个钱包数过去的时候,里面钱少于 100 块的不要(留在原来的盒子里),多于 100 块的丢到一个新的盒子里。这样结束的时候你又有了一个新的数组,里面是所有钱多于 100 块的钱包:
var fatWallets = wallets.filter(function (wallet) {
return wallet.money > 100;
});
最后要说明一点这个类比和实际代码的一个区别,那就是 map 和 filter 都是 immutable methods,也就是说它们只会返回一个新数组,而不会改变原来的那个数组,所以这里 filter 的例子是和代码有些出入的(原来的盒子里的钱包减少了),但为了形象说明,大家理解就好。
foreach 就是你按顺序一个一个跟他们做点什么,具体做什么,随便:
people.forEach(function (dude) {
dude.pickUpSoap();
});
map 就是你手里拿一个盒子(一个新的数组),一个一个叫他们把钱包扔进去。结束的时候你获得了一个新的数组,里面是大家的钱包,钱包的顺序和人的顺序一一对应。
var wallets = people.map(function (dude) {
return dude.wallet;
});
reduce 就是你拿着钱包,一个一个数过去看里面有多少钱啊?每检查一个,你就和前面的总和加一起来。这样结束的时候你就知道大家总共有多少钱了。
var totalMoney = wallets.reduce(function (countedMoney, wallet) {
return countedMoney + wallet.money;
}, 0);
补充一个 filter 的:
你一个个钱包数过去的时候,里面钱少于 100 块的不要(留在原来的盒子里),多于 100 块的丢到一个新的盒子里。这样结束的时候你又有了一个新的数组,里面是所有钱多于 100 块的钱包:
var fatWallets = wallets.filter(function (wallet) {
return wallet.money > 100;
});
最后要说明一点这个类比和实际代码的一个区别,那就是 map 和 filter 都是 immutable methods,也就是说它们只会返回一个新数组,而不会改变原来的那个数组,所以这里 filter 的例子是和代码有些出入的(原来的盒子里的钱包减少了),但为了形象说明,大家理解就好。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2018-06-27 · 百度知道合伙人官方认证企业
育知同创教育
1【专注:Python+人工智能|Java大数据|HTML5培训】 2【免费提供名师直播课堂、公开课及视频教程】 3【地址:北京市昌平区三旗百汇物美大卖场2层,微信公众号:yuzhitc】
向TA提问
关注
展开全部
map和foreach类似,都是遍历输出结果,只是方式不太一样,map直接对整个列表数据进行函数操作;而foreach是迭代对每行数据进行逐一操作,foreach灵活性更好吧,map效率更好点儿。 为什么reduce最后说呢。因为上面两个基本一样,你也可以混着用
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
map和foreach类似,都是遍历输出结果,只是方式不太一样,map直接对整个列表数据进行函数操作;而foreach是迭代对每行数据进行逐一操作,foreach灵活性更好吧,map效率更好点儿。
为什么reduce最后说呢。因为上面两个基本一样,你也可以混着用,但是reduce差别就大了,这是一个二元操作,就是对给定列表中的数据两个两个的进行每次的操作,调用的函数类似这样hex(x,y)
为什么reduce最后说呢。因为上面两个基本一样,你也可以混着用,但是reduce差别就大了,这是一个二元操作,就是对给定列表中的数据两个两个的进行每次的操作,调用的函数类似这样hex(x,y)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询