此过程遍历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);
}
}
}
答案 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);
}
}
}