Javascript数组过滤器:获取正确的上下文
在尝试编写一些很棒的JS时,我遇到了一些奇怪的JS行为。我创建了一段代码来演示我的问题:Javascript数组过滤器:获取正确的上下文,javascript,functional-programming,Javascript,Functional Programming,在尝试编写一些很棒的JS时,我遇到了一些奇怪的JS行为。我创建了一段代码来演示我的问题: $(函数(){ var images=$('.images').children(); var filtered=images.filter(函数(i,图像){ console.log(this); }“abc”); }); 结果1 结果2 结果3 结果4 结果5 结果6 结果7 结果8 结果9 结果10 结果11 结果12 结果13 结果14 结果15 好的,现在我的问题。使用Array.fil
$(函数(){
var images=$('.images').children();
var filtered=images.filter(函数(i,图像){
console.log(this);
}“abc”);
});
结果1
- 结果2
- 结果3
- 结果4
- 结果5
- 结果6
- 结果7
- 结果8
- 结果9
- 结果10
- 结果11
- 结果12
- 结果13
- 结果14
- 结果15
好的,现在我的问题。使用Array.filter方法时,将回调函数作为第一个参数传入,并将可选上下文作为第二个参数传入。如你们所见,我将“abc”作为上下文传递(当然,这是荒谬的)。我希望我的控制台会抛出很多“abc”,但它会打印jQuery元素
有人能照一下这个吗
谢谢
马蒂恩
如你们所见,我将“abc”作为上下文传递(当然,这是荒谬的)。我希望我的控制台会抛出很多“abc”,但它会打印jQuery元素
您使用的是没有上下文参数的,而不是ES5,因为您正在对jQuery对象调用filter
,而jQuery对象不是数组(尽管它们提供了许多类似数组的功能,以及一些具有类似名称的“方法”-包括filter
)
你有三个选择:
makeArray
可以使用jQuery将jQuery对象转换为数组,例如:
$(function() {
var images = $.makeArray($('.images').children());
var filtered = images.filter(function(i, image) {
console.log(this);
}, "abc");
});
代理
/绑定
或者,您也可以使用jQuery的函数(或ES5)来绑定要传递给jQuery的过滤器的迭代器函数,这样它就会忽略这个jQuery提供:
$(function() {
var images = $('.images').children();
var filtered = images.filter($.proxy(function(i, image) {
console.log(this);
}, "abc"));
});
对jQuery对象应用Array#filter
或您可以将数组#过滤器
直接应用于jQuery对象:
$(function() {
var images = $('.images').children();
var filtered = Array.prototype.filter.call(images, function(i, image) {
console.log(this);
}, "abc");
});
…因为Array#filter
被明确定义为可以处理任何类似数组的内容,而不仅仅是Array
s。最后一种可能实际上是最有效的方法 您没有使用JavascriptArray.filter()
,您使用的是jQuery的啊废话,谢谢。。我已经多次遇到同样的问题(使用jQuery方法而不是普通的老javascript方法)>@MartijnDwars:LOL不用担心,很高兴这有帮助。我为您添加了另外两个选项,最后一个选项可以避免创建不必要的临时对象。感谢您的详细解释!熟悉JS&jQuery真的很有帮助。@MartijnDwars:不客气!如果您有兴趣了解更多关于JS的信息。
$(function() {
var images = $('.images').children();
var filtered = Array.prototype.filter.call(images, function(i, image) {
console.log(this);
}, "abc");
});