有人可以向我解释数组原型函数之间的区别,例如map,filter,reduce和underscore的函数 .map, .fiter,_。减少。
我们可以通过使用array.map,array.filter和array.reduce来解决问题。但为什么强调功能主要用于?
请建议任何链接或告诉我概念证明。
谢谢,
答案 0 :(得分:1)
我认为@ouroborus回答你的主要问题,数组和对象是不同的,下划线的地图,forEach和reduce用于对象(不是数组)
您最近提到的一些功能,即使对于阵列,也不是核心ECMAScript / JavaScript的一部分。图书馆是由编程人员创建的,他们厌倦了一遍又一遍地滚动自己。但是,他们也不想对他们所操作的核心对象进行原型更改。在不进入每个功能的情况下,Mozilla的文档列出了添加该功能的ECMAScript的修订版。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array
一个注意事项。例如像angular这样的一些框架,也重新实现.forEach
之类的东西,但是其中一些情况是自定义实现,例如angular.forEach
的情况,它跳过从{{1}开始的属性}。
答案 1 :(得分:1)
通常,下划线函数对列表(可以某种方式像数组一样对待的对象)进行操作,而原型只对它们所附着的对象进行操作。例如,_.map()
适用于对象(字典),而Array.prototype.map()
只能从数组中调用。
答案 2 :(得分:1)
查看filter
,map
和reduce
。
以下都会产生相同的结果:
_.filter([1,2,3], function(n) { return n % 2 });
[1,2,3].filter(function(n) { return n % 2 });
// [1,3]
_.map([1,2,3], function(n) { return n * 10; });
[1,2,3].map(function(n) { return n * 10; });
// [10,20,30]
_.reduce([1,2,3], function(a,b) { return Math.max(a,b); });
[1,2,3].reduce(function(a,b) { return Math.max(a,b); });
// 3
具体查看map
以及传递给迭代器的参数,它们是相同的:
_.map([1,2,3], function(el, index, array) { ... })
[1,2,3].map(function(el, index, array) { ... })
然而,其他海报已经提到过,Underscore方法也适用于对象,但除此之外,它们还可以处理来自http://underscorejs.org/#each的类似数组的对象:
注意:集合函数适用于数组,对象和类似数组的对象,如参数,NodeList等。
其他海报也提到,任何不支持ES5的浏览器(2009年4月发布)都不会提供这些默认实现。 http://kangax.github.io/compat-table/es5/
但最后,Underscore提供的功能(在默认实现中不可用)是在迭代器中设置 context 的功能:
var obj = {A: true, B: false, C: true};
_.map(['B','B','C'], function(key) { return this[key]; }, obj);
// [false,false,true]
为什么这会有用?在函数中无法访问obj
吗?是的,它可以。传递上下文的正常用例是:
_.map([...], function(item) {
this.parentScopeFunction(...);
}, this);
要使用默认实现执行此操作,模式更详细:
var parentScope = this;
[...].map(function(item) {
parentScope.parentScopeFunction(...);
});