构建原型函数,如Array.map,Array.filter VS _.map,_.filter

时间:2016-10-23 06:02:40

标签: javascript underscore.js

有人可以向我解释数组原型函数之间的区别,例如map,filter,reduce和underscore的函数 .map, .fiter,_。减少。

我们可以通过使用array.map,array.filter和array.reduce来解决问题。但为什么强调功能主要用于?

请建议任何链接或告诉我概念证明。

谢谢,

3 个答案:

答案 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)

查看filtermapreduce

以下都会产生相同的结果:

_.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(...);
});