jQuery grep不能处理元素属性?

时间:2016-06-15 05:55:38

标签: jquery grep

我在[{1}} ...

中看到了一些有趣的行为
grep

正如您所看到的,唯一的区别是在第一个成功的代码中我定义了一个单独的id变量。为什么// where gon.items = array of objects with various properties, one of which is id var id = $(this).data("id") var inventory_item = $.grep(gon.items, function(e){ return e.id == id })[0] => successfully retrieves object var inventory_item = $.grep(gon.items, function(e){ return e.id == ($(this).data("id")) })[0] => [] 需要这个而不允许我传递元素属性?或者我做错了什么?我在文档中找不到解释。

2 个答案:

答案 0 :(得分:3)

那是因为背景。当您将函数传递给$.grep时,该函数中的上下文this将为window

你可以控制它和.bind不同的上下文,如下所示:

var inventory_item = $.grep(gon.items, function(e){ return e.id == $(this).data("id") }.bind(this))[0]

答案 1 :(得分:-1)

与许多jQuery函数不同,jQuery.grep()不会将this的上下文更改为正在迭代的当前项。实际上,在grep回调中,this保留了它的全局上下文,并且在浏览器中将引用window对象。所以最有可能$(this).data("id") === undefined

以下是一个演示此内容的快速摘录:

var g = [1, 2, 3];
$.grep(g, function(item) {
  console.log(this === window);
  return false;
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

如果您正在处理一组jQuery元素,您可能希望使用.filter()代替,这将提供您期望的行为。