我有一个这样的obj:
var obj = { thing1 : { name: 'test', value: 'testvalue1'},
thing2 : { name: 'something', thing4: {name:'test', value: 'testvalue2'}},
}
我想写一个像findByName(obj,' test')这样的函数。它返回所有匹配的具有相同名称的子对象。所以它应该返回: {name:' test',value:' testvalue1'} {name:' test',value:' testvalue2'}
现在这就是我所拥有的:
function findByName(obj, name) {
if( obj.name === name ){
return obj;
}
var result, p;
for (p in obj) {
if( obj.hasOwnProperty(p) && typeof obj[p] === 'object' ) {
result = findByName(obj[p], name);
if(result){
return result;
}
}
}
return result;
}
显然它只返回第一个匹配..如何改进这个方法?
答案 0 :(得分:0)
您需要将结果推送到数组中并使函数返回数组。
此外,执行完整性检查对象是null还是未定义以避免错误。 这是您的代码修改。 注意:我还修改了父对象,即“obj”,通过添加值为“test”的“name”属性,因此结果也应该在结果中包含父对象。
function findByName(obj, name) {
var result=[], p;
if(obj == null || obj == undefined)
return result;
if( obj.name === name ){
result.push(obj);
}
for (p in obj) {
if( obj.hasOwnProperty(p) && typeof obj[p] === 'object') {
newresult = findByName(obj[p], name);
if(newresult.length>0){
//concatenate the result with previous results found;
result=result.concat(newresult);
}
}
}
return result;
}
var obj = { thing1 : { name: 'test', value: 'testvalue1'},
thing2 : { name: 'something', thing4: {name:'test', value: 'testvalue2'}},
name:'test' //new property added
}
//execute
findByName(obj,"test");
如果这对您有帮助,请在您的控制台中运行此命令并进行upvote。