如何在纯JS中实现jQuery.map()的等效功能
How to implement the equivalent for jQuery .map() in plain JS?
我正在努力将我的代码转换为纯JS,这真的很难。我需要一个函数来获得真正的滚动容器,而我拥有的这个函数是这样的,使用.map()
。
//get true container for scroll events
function getScrollContainer(c) {
return $(c).map(function() {
var cnt = this,
isWin = !cnt.nodeName || $.inArray( cnt.nodeName.toLowerCase(), ['iframe','#document','html','body'] ) != -1;
if (!isWin) return cnt;
var doc = (cnt.contentWindow || cnt).document || cnt.ownerDocument || cnt;
return /webkit/i.test(navigator.userAgent) || doc.compatMode == 'BackCompat' ?
doc.body :
doc.documentElement;
});
}
console.log(getScrollContainer(window));
有办法做到这一点吗?
Map只是一种奇特的方式来表示"将此函数应用于列表中的每个元素",因此它可以在for循环中轻松实现。
类似这样的东西:(不完美或测试,但应该给你一个想法)
function getScrollContainer(c) {
c = Object.prototype.toString.call( c ) === '[object Array] ? c : [c];
for (var i = 0; i < c.length; i++) {
var cnt = c[i],
isWin = !cnt.nodeName || indexOf(cnt.nodeName.toLowerCase(), ['iframe','#document','html','body'] ) != -1;
if (!isWin) return cnt;
var doc = (cnt.contentWindow || cnt).document || cnt.ownerDocument || cnt;
return /webkit/i.test(navigator.userAgent) || doc.compatMode == 'BackCompat' ?
doc.body :
doc.documentElement;
}
}
根据您发布的代码,您不需要使用map
方法。您的函数只接受一个参数,因此您可以删除var cnt = this,
行并使用c
参数。现在,您的函数不返回length
为1的jQuery封装数组,而是返回HTMLElement
对象。
如果要将数组传递给函数,可以使用Array.prototype.map
方法:
function getScrollContainer(c) {
return c.map(function(value, index, arr) {
// ...
});
}
console.log(getScrollConainer([window, 'foo']));
要替换jQuery $.inArray
实用程序函数,可以使用Array.prototype.indexOf
方法:
['iframe','#document','html','body'].indexOf(cnt.nodeName.toLowerCase()) != -1
请注意,IE8及以下版本不支持Array map
和indexOf
方法。如果你想支持这些浏览器,你可以使用polyfill。MDN建议对CCD_ 12进行这种多填充。
虽然以上答案在您的情况下有效,但并非在所有情况下都有效。jQuery的map创建一个新数组,并在将函数应用于数组中的每个项后返回该数组。
原型映射函数不创建新的数组,而是简单地将该函数应用于每个项。
这有时会产生相同的结果,而另一些则会产生不同的结果。
对于这个例子,你会得到相同的结果:
$.map([1,2,3], function(i){ return i+1; });
=> [2,3,4]
[1,2,3].map(function(i){ return i+1; });
=> [2,3,4]
然而,以下示例将提供不同的结果:
$.map([1,2,3], function(i){ if(i > 1){ return i; } });
=> [2,3]
[1,2,3].map(function(i){ if(i > 1){ return i; } });
=> [undefined,2,3]
如果有人感兴趣,如果您为Array原型创建了一个新函数,您可以在.map()中使用if语句:
Array.prototype.custom_Map = function(x) {
arr = [];
for (var i = 0; i < this.length; i++)
var _this = (x(this[i], i, this));
if(_this !== null) {
arr.push(_this);
return arr;
};
您可以通过以下方式使用它:
x.custom_Map(function(a){ if(a>0) {return true;}});
- 添加文字和评论功能更新Div
- JavaScript打印功能使日历停止工作
- 每当您在选择器内移动鼠标时,悬停功能就会重复
- 如何防止网页加载后自动启动功能
- 除修剪外的其他功能
- 悬停功能触发器
- 使用angularjs向浏览器发送servlet响应(下载功能)
- 删除CKEditor工具栏按钮,但不删除功能
- 异步facebook功能
- 如何将chrome扩展功能移植到移动设备(特别是jquery和trello)
- 在下划线中使用_(obj).map(callback)和_.map(obj,callback)之间的区别
- jQuery滚动功能只工作一次
- Graphiti中是否有任何工具提示功能
- React redux初始化功能,无论状态变化如何
- 使用map来检查是否为真'不起作用
- 在哪里可以学习ECMAScript标准中尚未包含的JavaScript功能
- 如何在纯JS中实现jQuery.map()的等效功能
- 具有TD和Input的Jquery Map功能
- 了解中使用的阻力贴图功能http://urban-walks.com/#map.
- 具有多变量功能的Lodash Map