我试图在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
但是我还没有能够复制提出的解决方案。任何帮助都会很棒......
答案 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
将具有foo
和bar
的属性,然后您可以使用它们来访问每个的值,例如:
el.foo == 1 // True
el.bar == 2 // True
也许如果您真的发布了JSON回复,我可能会进一步帮助您。 (更新您的问题,不将其作为评论发布)