【问题标题】:Increment array in $.each$.each 中的增量数组
【发布时间】:2014-06-04 01:52:01
【问题描述】:

我想将一组循环遍历包含 k:v 对对象的数组数组的 $.each 语句组合成一个可以递增的 $.each

PHP返回的数组结构:包含对象的数组数组。

PHP:这是运行然后发送回 JavaScript 的内容。

array_push($allDataArray, $completedLevelData, $completedQuestData, $completedNPCData);

JavaScript

我最初使用单独的 $.each 来循环遍历每个对象数组。但我想将这些 $.each 语句合并成更小的东西:

function updateData (functionToRun, callback) {  
   $.getJSON("phpscripts.php", {
            "_player" : Player,
            "_playerID" : UserID,
            "_functionToRun" : functionToRun
        },

        function(result) {      
            var questIDs = [];

            $.each(result[0], function (i, allData) {   
                $(".completedLevels").append("<br/>"+allData['levelname']);
            });
            $.each(result[1], function (i, allData) {   
                questIDs.push(allData['quest_id']);
                $(".completedQuests").append("<br/>"+allData['quest_id']+ ", " + allData['questname']);
            });
            $.each(result[2], function (i, allData) {   
                $(".completedNPCs").append("<br/>"+allData['npc_name']);
            });
etc...      

为此,我只是要循环使用for 并追加...但for 与每个不同,即使它们为空,也会继续循环和添加元素。例如,

for (obj in result) {
    for (obj2 in result[obj]) {
        console.log(result[obj][obj2]['levelname']);
    }
}

给予:

mymap2 
mymap 
(9) undefined 
[] 

所以即使没有数据它也会继续循环。我不希望它那样做。

话虽如此,然后我尝试了$.each,并尝试在父数组循环遍历所有子数组时递增父数组。基本上是在模仿上面,但是将所有$.each 合并为一个$.each,如下所示:

var k = 0, j = 0;
$.each(result[k], function (i, allData) {   
    //if you loop through all objects within parent object, move to next parent object
    if (j == result[k].length) {
        k++;
        j=0;
    }
    j++;
 etc...

但它只会在循环遍历所有 result[0] 后停止,而不增加 k。知道怎么做吗?


编辑:我尝试了下面的答案,但它仍然显示undefineds 正在加载:

for (var i = 0; i < result.length; i++) {
    $.each(result[i], function (j, allData) {
        $(".completedLevels").append("<br/>"+allData['levelname']);
    });
}

附加以下内容:

已完成关卡:

  • 我的地图
  • 未定义
  • 未定义
  • 未定义

【问题讨论】:

  • 您是否有机会对您的数据执行 JSON 字符串化并将结果放入您的问题中?它将允许我使用相同的数据集进行测试。
  • 看起来简化了result[1]result[2] 中的数组不包含带有.levelnames 的对象,而是带有.quest_ids 和.npc_names 的对象。难怪你在尝试访问levelname 时会得到undefined。顺便说一句,don't use for in loops on arrays.

标签: javascript php jquery arrays


【解决方案1】:

您实际上并没有使用任何 JavaScript 来告诉浏览器您要在“$.each”命令完成一次后运行它。

将其放入 for 循环中:

for (var i = 0; i < result.length; i++) {
    $.each(result[i], function (j, allData) {   

        // Do whatever you like in here            

    }
}

小提琴:http://jsfiddle.net/9fhj4/

编辑:为了记录,如果您只是处理数组,那么对于您正在做的事情的更好方法是在两个语句中都使用 for:

for (var i = 0; i < result.length; i++) {
    for (var j = 0; j < result[i].length, j++) {   

        // Do whatever you like in here      

    }
}

再次编辑:针对您的评论,我尝试修改小提琴以更准确地表示您正在使用的数据结构:http://jsfiddle.net/9fhj4/2/

【讨论】:

  • 我需要三个 for 循环,因为它是一个包含对象的数组。无论如何,为什么只使用 for 循环更好?
  • @Growler 见上文,我已修改我的答案以包含一个与您的实际数据集更相似的示例。
  • 关于您为什么应该使用 for 而不是 each 的问题,请参阅此问题:stackoverflow.com/questions/11887450/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-27
  • 2015-11-13
  • 2012-05-30
相关资源
最近更新 更多