Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/409.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 对象的宽度优先遍历_Javascript_Jquery_Json_Breadth First Search - Fatal编程技术网

Javascript 对象的宽度优先遍历

Javascript 对象的宽度优先遍历,javascript,jquery,json,breadth-first-search,Javascript,Jquery,Json,Breadth First Search,我正在制作一个程序来解决一个益智游戏,它会在一个棋盘上找到所有可能的移动,并将所有可能产生的棋盘放入一个对象中。然后,它会为生成的板找到所有可能的移动,依此类推。对象的外观如下所示: { "board": { "starts": [[0,0],[0,3]], "blocks": [[3,0],[3,3]], "ends": [[2,4]] }, "possibleMoves": [ { "board": {

我正在制作一个程序来解决一个益智游戏,它会在一个棋盘上找到所有可能的移动,并将所有可能产生的棋盘放入一个对象中。然后,它会为生成的板找到所有可能的移动,依此类推。对象的外观如下所示:

{
  "board": {
      "starts": [[0,0],[0,3]],
      "blocks": [[3,0],[3,3]],
      "ends":   [[2,4]]
  },
  "possibleMoves": [
    {
      "board": {
        "starts": [[0,0],[2,3]],
        "blocks": [[3,0],[3,3]],
        "ends":   [[2,4]]
      },
      "possibleMoves":[
        {
          "board": {},
          "possibleMoves": [{}]
        }
      ]
    },
    {
      "board": {
        "starts": [[0,3]],
        "blocks": [[3,0],[3,3]],
        "ends":   [[2,4]]
      },
      "possibleMoves":[{}]
    }]
}
我可以想出如何从顶层板添加可能的移动,但我无法想出如何在第二层板中循环所有生成的板并找出它们可能的移动,然后循环所有第三层板,依此类推。如何使用广度优先搜索添加可能的移动和遍历对象?

递归

function traverse(state) {
    handle(state.board);
    if (state.possibleMoves) {
        $.each(state.possibleMoves, function(i, possibleMove) {
             traverse(possibleMove);
        });
    }
}
编辑:对于广度优先搜索,请尝试以下方法。它不使用递归,而是在不断增长的队列上迭代

function traverse(state) {
    var queue = [],
        next = state;
    while (next) {
        if (next.possibleMoves) {
            $.each(next.possibleMoves, function(i, possibleMove) {
                queue.push(possibleMove);
            });
        }
        next = queue.shift();
    }
}
未完全测试:

var oo = {
    board: {
        starts: [[0,0],[0,3]],
        blocks: [[3,0],[3,3]],
        ends:   [[2,4]]
    },
    possibleMoves: [{
        board: {
            starts: [[0,0],[2,3]],
            blocks: [[3,0],[3,3]],
            ends:   [[2,4]]
        },
    }],
};


function traverseObject (o) {
    for (var prop in o) {
        if (typeof o[prop] == "array" || typeof o[prop] == "object") {
            traverseObject(o[prop]);
            console.log(prop);
        } else {
            console.log(prop, "=", o[prop]);
        }
    }
}

traverseObject(oo);

我没有JavaScript描述,但我通常会保留一个未探测节点队列

  • 仅从队列中的根节点开始
  • 从队列前面弹出一个项目
  • Explore it将在搜索期间找到的所有节点添加到队列的后面
  • 检查队列中是否有任何节点,如果有,请返回步骤2
  • 你的工作完成了
  • 维基百科页面上也有一些伪足,还有一些解释

    另外,谷歌的快速搜索也发现了一个类似的算法,它可以满足你的需求

    你可能想在这里搜索“递归”和“递归函数”,一般来说,网络应该有丰富的信息。你熟悉递归吗?仔细想想,这不是处理第一级,然后在第二级遍历第一块板,处理它,然后在第三级遍历第一块板,依此类推吗?我希望它处理第一块板,然后在第三层开始处理任何东西之前遍历第二层的所有板。对。在这种情况下,您需要实现一个队列。我向你们展示的是深度优先遍历。您需要宽度优先遍历。检查一个合适的算法。好的。我想我不太清楚我想要什么。我修改了问题。