Javascript无限循环遍历Javascript对象

时间:2014-07-29 02:58:57

标签: javascript infinite-loop traversal

此过程遍历Javascript对象导致无限循环。如果我在初始化而不是关键事件上调用它,相同的代码似乎有效...感谢您的帮助!

<form>
    <input id="searchBox" name="searchText" placeholder="Search" onkeyup="search()">
</form>

<script src="http://d3js.org/d3.v3.min.js"></script>
<script>


var searchText = ""

function search(){
    searchText = document.getElementById('searchBox').value;
    traverse(jsonData,process);
}

//traverse JSON object
function traverse(json,func) {
    for (var i in json) {
        func.apply(this,[i,json[i]]);
        if (json[i] !== null && typeof(json[i])=="object") {
            console.log("STEP IN");
            traverse(json[i],func);
        }
    }
}

1 个答案:

答案 0 :(得分:1)

如果对象是递归的,则很容易导致无限循环:

jsonData = {};
jsonData.x = jsonData;

您可以使用弱映射来跟踪您访问过的节点并避免递归。

var map = new WeakMap();

function traverse(data, func) {
  if (data != null || "object" !== typeof data || map.get(data)) { return; }

  map.set(data, true);

  for (var i in data) {
    func.apply(this, [i, data[i]]);
    console.log("STEP IN");
    traverse(data[i], func);
    }
  }

}