以下是我编写的非递归js代码,用于遍历json对象并对其执行操作。
//function to disallow property for any node if required
function disallowAdditionalProperties(node) {
//console.log('working on '+JSON.stringify(node))
if (typeof node === 'object') {
if (node.properties) {
//console.log('has properties')
node.additionalProperties = false
}
}
}
//function to walk trhough all json nodes and perform any action on it
function jsonWalkAction (json,action) {
//console.log('prior schema');
//console.log(json)
var node = json;
var rootName = 'root';
var hrchy = {'root':{}};
var nodeKeys = Object.keys(node);
var attrib;
var i = 0;
if (nodeKeys.length>0) {
action(node)
do {
attrib = nodeKeys[i++];
//console.log("attrib: "+attrib);
if (attrib && typeof node[attrib] === "object") {
//capture current node info
hrchy[rootName].pos = i;
hrchy[rootName].ref = node;
//initiate next node traversal
i = 0;
hrchy[attrib] = {};
hrchy[attrib].parent = rootName;
node = node[attrib];
//perform action on this node
action(node);
//update
hrchy[attrib].ref = node;
nodeKeys = Object.keys(node);
rootName = attrib;
}
//check if no more attributes remain for this node
while (i>=Object.keys(node).length) {
//break if already on root node
if (rootName === 'root') break;
//switch to parent
prevName = rootName;
rootName = hrchy[rootName].parent;
hrchy[rootName].ref[prevName]=node;
node = hrchy[rootName].ref;
nodeKeys = Object.keys(node);
i = hrchy[rootName].pos;
}
} while (Object.keys(node).length > i);
}
}
现在如果我必须对每个选择执行同步操作而不是仅添加错误的附加属性标志 - 如何并行执行每个同步调用,即每个节点操作在javascript中的单独线程中。一个例子可能是每个节点都加载了数据,代码对其进行了密集解析。