我应该如何从嵌套的json对象中获取匹配的子对象

时间:2015-10-22 03:09:49

标签: json nested javascript-objects

我有一个这样的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;
}
显然它只返回第一个匹配..如何改进这个方法?

1 个答案:

答案 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。