将jQuery的getJSON返回值存入数组变量并操作JSON数组

5


有没有办法将$.getJSON的返回值存入变量数组中?
我知道它是异步的并且超出了范围,但我会在ajax回调函数内部使用它,我只需要先获取所有值并将其与另一个数组进行比较。

像这样:

$.getJSON('itemManager.php?a=getItems', function(data){
    // itemArray = new Array(data);
    // idsArray = new Array(data.id);
    for (var i in someOtherArray){
        if($.inArray(i, idsArray) == -1){
            // do something...
            // get jason variable by id?
            // itemArray[i].someVariable
        }
    }
}

编辑:JSON结构

[{"id":"786","user_id":"1","seller_id":"2","address_id":"1","time":1299852115,"publicComment":null,"personalComment":null},
{"id":"787","user_id":"1","seller_id":"2","address_id":"1","time":1299852115,"publicComment":null,"personalComment":null},
{"id":"785","user_id":"1","seller_id":"2","address_id":"1","time":1299852114,"publicComment":null,"personalComment":null},
{"id":"784","user_id":"1","seller_id":"2","address_id":"1","time":1299852113,"publicComment":null,"personalComment":null},
{"id":"783","user_id":"1","seller_id":"2","address_id":"1","time":1299852111,"publicComment":null,"personalComment":null}]

这基本上是个想法。

  • 获取所有值
  • 隔离JSON对象的id值
  • 循环另一个数组
  • 检查json id是否在另一个数组中
  • 通过id值访问其他json变量

我猜这里有各种解决方案,但我正在寻找代码最少的东西。


我只是在寻找一种最小化的代码方法来解决这个问题。我并没有经常使用jquery,也不熟悉所有的片段。只是想避免循环所有内容并添加/检查值。 - ZolaKt
2
@ZolaKt:那么someOtherArray中的数组长什么样子,data的值是多少?如果我们不知道结构,就无法告诉您如何访问它。这与jQuery无关,只是基本的JavaScript。 - Felix Kling
另一个数组只是int值(响应json ids)。我只需要从json返回中提取id键到单独的数组中。 - ZolaKt
2
@ZolaKt:但是data是什么?它是一个单一的对象还是一个对象数组?为什么不直接发布结构,这样会更容易理解。 - Felix Kling
1
@ZolaKt:展示一些JSON示例,以及someOtherArray或其他你想使用的内容示例,并告诉我们你想要做什么。不清楚你想要做什么以及使用什么。 - rsp
显示剩余2条评论
2个回答

3

根据给定的信息,没有测试ID存在的捷径。你真的必须遍历所有内容。但是,您可以通过创建一个id => object映射来稍微改进:

$.getJSON('itemManager.php?a=getItems', function(data){
    var items = {};
    for(var i = data.length; i--; ) {
        items[data[i].id] = data[i];
    }
    for (var j = someOtherArray.length; j--; ){
        var item = items[someOtherArray[j]];
        if(item){
            // do something with `item`
        }
    }
}

如果您在服务器上创建此结构,则会更好,这样它将是:
$.getJSON('itemManager.php?a=getItems', function(data){
    for (var j = someOtherArray.length; j--; ){
        var item = data[someOtherArray[j]];
        if(item){
            // do something with `item`
        }
    }
}

你还应该考虑哪个数组将包含更多元素,data还是someOtherArray,并调整你的数据结构,使你只循环遍历小数组。

更新:

为了在PHP服务器上创建适当的结构,你必须创建一个关联数组。

因此,在你向数组添加对象的时候,不要这样做。

$items[] = $obj;

但是
$items[$obj->id] = $obj; // or $obj['id'] if you have an array

顺便问一下,jQuery.parseJSON 会处理映射吗? - ZolaKt
@ZolaKt:不是的。如果你的JSON是[{...}, {...}],那么无论如何你都会得到一个JavaScript数组。你必须将你的JSON创建为{id1: {...}, id2: {...}},然后你就会得到一个JavaScript对象(这将是映射)。jQuery.parseJSON只是将JSON解析为JavaScript数据结构,并且使用getJSON已经完成了这个过程。 - Felix Kling
有关如何调整服务器返回的建议吗?在php中,我使用json_encode($items)返回/输出自定义对象数组。 - ZolaKt
嗯,不是那么简单。它是基于对象的整个面向对象结构,而不是关联数组,所以我想我会保留额外的循环并采用你的第一个示例。谢谢。 - ZolaKt
@ZolaKt:不用谢。为了完整起见:在将其传递给json_encode之前,您还可以遍历$items数组并创建具有此结构的新数组。我只是想避免两次循环数据... - Felix Kling

2
如果你的JSON响应是一个数组,那么在回调函数中,你的data变量就是一个数组,不需要对它进行任何处理。
如果你的JSON响应是一个对象,如你的示例中的data.id所示,并且其中一些值是一个数组,那么只需将data.id用作数组,或者如果更方便的话,使用var array = data.id;
记住,在回调函数中,data只是你从JSON获取的内容。它可以是一个对象(即关联数组),一个数组,一个字符串,一个数字,或者是一个true、false或null值。如果它是一个对象,你可以使用data.key来访问它,如果它是一个数组,你可以使用data[index]来访问它。我这样说是因为我怀疑你可能在混淆数组和对象。

好的,很好。有什么建议可以只获取ID键而不用通过$ .each键值循环遍历所有内容吗? - ZolaKt
@ZolaKt:如果您展示一些需要遍历的JSON数据示例,那将会更容易些。 - rsp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接