2017-07-26 63 views
1

你好,我在我的函数返回一个对象的问题,比方说,我有一个对象:JavaScript的按价值计算深嵌套对象/数组找到

var elements = [{ 
    "fields": null, 
    "id_base": "nv_container", 
    "icon": "layout", 
    "name": "container", 
    "is_container": true, 
    "elements" : [ 
     //another elements set here 
    ] 
}, 
{ 
    "id_base": "novo_example_elementsec", 
    "name": "hello", 
    "icon": "edit", 
    "view": {} 
}]; 

我想要的是一个函数(在纯JavaScript),可以找到一个特定的键和值的对象,我已经创建了一个函数,但它只是不能正常工作? ,我的功能:

function findNested(obj, key, value) { 
    //Early return 
    if (obj[key] === value) { 
     console.log('before return'); //until here . its fine 
     return obj; //not working 
    } else { 
     for (var i = 0, len = Object.keys(obj).length; i <= len; i++) { 
      if (typeof obj[i] == 'object') { 
       this.findNested(obj[i] , key, value); 
      } 
     } 
    } 
} 

我只是不明白我做错了什么?

谢谢。

回答

1

您在递归调用后错过了返回。如果在递归之后找到该对象,则需要继续冒泡该结果(通过返回它)。正如@ scott-marcus指出的那样,您还应该使用i < len(而不是i <= len)。

var elements = [{ 
 
    "fields": null, 
 
    "id_base": "nv_container", 
 
    "icon": "layout", 
 
    "name": "container", 
 
    "is_container": true, 
 
    "elements": [ 
 
     //another elements set here 
 
    ] 
 
    }, 
 
    { 
 
    "id_base": "novo_example_elementsec", 
 
    "name": "hello", 
 
    "icon": "edit", 
 
    "view": {} 
 
    } 
 
]; 
 

 
function findNested(obj, key, value) { 
 
    // Base case 
 
    if (obj[key] === value) { 
 
    return obj; 
 
    } else { 
 
    for (var i = 0, len = Object.keys(obj).length; i < len; i++) { 
 
     if (typeof obj[i] == 'object') { 
 
     var found = this.findNested(obj[i], key, value); 
 
     if (found) { 
 
      // If the object was found in the recursive call, bubble it up. 
 
      return found; 
 
     } 
 
     } 
 
    } 
 
    } 
 
} 
 

 
console.log(findNested(elements, "icon", "layout")); // returns object 
 
console.log(findNested(elements, "icon", "edit")); // returns object 
 
console.log(findNested(elements, "foo", "bar")); // returns undefined

+0

非常感谢@smarx,这就是我想要的,我一直在寻找6小时,由于解决方案再次 –