getJson grep中的变量范围

时间:2011-06-22 19:27:26

标签: jquery scope getjson

我试图在getJson请求的grep中使用变量。我希望根据用户的选择(他们点击的链接)来定义变量 - 但是我不知道如何将它传递给grep,因为看起来变量必须在getJson调用中定义?

第一个例子有效:

$.getJSON('data/all.json', function(data)
  {
    location = $.grep(data, function(el, i)
     {
       var search=el.clicked_field;
       return search === "Y"
      });
     });

第二个没有:

var search=el.clicked_field;
$.getJSON('data/all.json', function(data)
  {
    location = $.grep(data, function(el, i)
     {
       return search === "Y"
      });
     });

我认为这个问题在jQuery论坛中讨论过: http://forum.jquery.com/topic/variable-scoping-and-the-getjson-method

但是我还没有能够复制提出的解决方案。任何帮助都会很棒......

2 个答案:

答案 0 :(得分:0)

你在第二个grep的回调中定义el,这就是为什么它在该范围之外未定义。

答案 1 :(得分:0)

这两段代码中唯一明显的区别是var search=el.clicked_field$.grep的上下文移动到整个代码体之前。此时,el尚不存在。所以,除非你有一些其他代码覆盖了帖子中遗漏的内容,否则这就是你的问题。

修改

小JavaScript提示。变量在其范围内是全局的,因此请举例如下:

$('#some-element').click(function() {
    var someElement = $(this);

    $.getJSON('url', function(data, jqXHR){
        console.log(someElement); // exists!
    });
});

编辑:(再次)

好的,你的逻辑和语法有一些基本问题。在评论中一次处理这一方面变得有点乏味,所以我只想说明一下:

$('#some-element').click(function() {
    var someElement = $(this).attr('href'); 

    // someElement == 'http://google.com'

    $.getJSON('data/all.json', function(data) {
       location = $.grep(data, function(el, i) {
           clicked = someElement.toLowerCase().slice(1);

           // clicked == 'ttp://google.com'   # Why?

           link = 'el' + '.' + clicked;

           // link == 'el.ttp://google.com'   # Why?

           console.log(link);  // This bit was for illustrative purposes, you should remove it from your code now.
           return link === "Y";

           // "el.ttp://google.com" != "Y"   # Obviously, and never will
       });
    });

data是JavaScript对象的列表。将其传递给$.grep将导致它迭代这些对象。每次迭代时,当前对象将存储在el中,data数组中该对象的索引将存储在i中。以JSON的这个例子为例:

[ { "foo": 1, "bar": 2 } ]

如果那是返回的JSON,那么el将具有foobar的属性,然后您可以使用它们来访问每个的值,例如:

el.foo == 1 // True
el.bar == 2 // True

也许如果您真的发布了JSON回复,我可能会进一步帮助您。 (更新您的问题,将其作为评论发布)