2010-08-09 45 views
1

如何将从jQuery getJSON收到的数据存储到数组中以备后用?jQuery - getJSON数据到数组

下面是一个示例代码段 - 不知何故循环的data未被存储到全局haikus

 

$(document).ready(function(){ 
    var haikus=[]; 
    alert("begin loop"); 
    $.getJSON('http://haikuennui.com/random.php',function(data){ 
     var i=0; 
     for(i=0;i<data.length;i++){ 
      haikus[i]=[data[i].id,String(data[i].username),String(data[i].haiku)]; 
     } 
      alert(haikus[0][1]); 
    }); 
}) 
​ 
 

http://jsfiddle.net/DMU2v/

+1

,是什么样子? – 2010-08-09 08:01:30

+0

我无法引用getJSON回调之外的任何元素。我试过在回调中定义一个array = data [i](for循环,i),但数组读取undefined之外的回调 – ina 2010-08-09 08:03:50

+0

添加了一个片段 – ina 2010-08-09 08:21:04

回答

1

如果我正确理解你的问题,你想缓存一些AJAX检索的项目?

所以,如果所有项目这个样子,说:

{ id: 1, value: 'Test' } 

...你不希望如果你已经做了一次AJAX取的ID = 1的值。 ..?

在这种情况下,在全球范围内的某处声明缓存变量:

var ajaxCache = {}; 

在您检索功能的成功,还要加上:

ajaxCache['item' + item.id] = item; 

当你这样做,你可以修改您的检索功能,如:

if(('item' + id) in ajaxCache) { 
    return ajaxCache['item' + id]; 
} 

// continue to fetch 'id' as it didn't exist 

应该指出,这实际上不是一个数组。我没有使用数组的原因是,使用ID 2000分配一个项目会使数组的长度为2001,而不仅仅是为它添加一个属性。因此,无论您如何处理它,从0到array.length的迭代都不会是获取所有项目的好方法(在此特定上下文中,这是数组和对象之间的区别唯一的场景)。

相反,迭代这个对象,你需要写

for(var key in ajaxCache) { 
    var item = ajaxCache[key]; 

    // whatever you want to do with 'item' 
} 

哦,删除对象:如果不是已经是一个数组

delete ajaxCache['item' + id]; 
+0

(添加片段 - 见上面) – ina 2010-08-09 08:29:02

+0

@ina:好吧,那看起来好像我对你正在尝试的假设要做的是正确的。改变你的代码,使它利用我所描述的,应该解决你的问题。 – 2010-08-09 08:33:18

+0

而不是使用关联数组,为什么不循环通过增量式填充数组的json数据..这正是我在我的代码片段中所要做的,但尽管我可以在getJSON函数回调中的循环内检索数据,但不能通过外部存储的数组获取数据。 – ina 2010-08-09 17:14:45

0

只是确保您收到的JSON是一个数组。将此JSON数组存储到数组中并随时使用。

+0

你如何确保收到的JSON是一个数组? – ina 2010-08-09 08:21:21

+0

http://stackoverflow.com/questions/951483/how-to-check-if-a-json-response-element-is-an-array – Adirael 2010-08-09 08:44:39

+0

示例数组'var arr =“[1,2,3,4 ,5]“' – 2010-08-09 09:28:16