我正在尝试扩展下面的findKey算法(在nodejs中),以支持在与keyObj签名匹配的树中查找子对象的所有实例。最初的算法:
Object.prototype.findKey = function(keyObj) {
var p, key, val, tRet;
for (p in keyObj) {
if (keyObj.hasOwnProperty(p)) {
key = p;
val = keyObj[p];
}
}
for (p in this) {
if (p == key) {
if (this[p] == val) {
return this;
}
} else if (this[p] instanceof Object) {
if (this.hasOwnProperty(p)) {
tRet = this[p].findKey(keyObj);
if (tRet) {
return tRet;
}
}
}
}
return false;
}
我的第一次天真的尝试完成了所有的发现:
Object.prototype.findAllWithKey = function(keyObject) {
let objectCopy = Object.assign({}, this);
console.log('findAll on : \n\n');
console.log(this);
let keyFound = false;
let keysFound = [];
do {
console.log("while loop iteration...");
keyFound = objectCopy.findKey(keyObject);
console.log(keyFound);
if (keyFound) {
keysFound.push(keyFound);
console.log('\n\nkey found:');
objectCopy = JSON.parse(JSON.stringify(objectCopy).replace(JSON.stringify(keyFound)+',', ''));
} else {
console.log('\n\n key not found');
keyFound = false;
}
} while (keyFound !== false);
console.log('Broke out of while loop')
};
用法如下:
let targetObject = response.findAllWithKey({
name: 'GetStatusCode'
});
其中响应对象包含一个带有多个子节点的js树结构和包含{name:'GetStatusCode'}的子对象实例。
有人能指出我找到一个更好的方法来实现这个,因为JSON字符串化/解析感觉不成功(加上它在最后一个对象失败,因为没有,在那里提供,我可以修复,但那里必须是一个更好的方法来完成findAll)。
答案 0 :(得分:0)
事实证明,我可以使用树遍历完成所有查找,因为xml,json或whathever实际上是作为树结构组成的。例如,可以使用preorder遍历的算法(lodash为其contrib包中的树遍历提供了一些帮助)。
Object.prototype.findAllWithKey = function(keyObject) {
resultSet = [], i = 0;
_.walk.preorder(this, function(value, key, parent) {
if (keyObject[key] === value) {
resultSet.push(parent);
}
});
return resultSet;
};