按键查找和检索对象值,包括嵌套对象

Its*_*has 2 javascript javascript-objects angularjs

我试图在不知道对象valuekey情况下找到一个对象,包括嵌套对象,因此该函数将获取一个键和一个对象并返回值或未定义。这是我的功能:

/* Iterate over object and include sub objects */

function iterate (obj, key) {

    for (var property in obj) {
        if (obj.hasOwnProperty(property)) {
            //in case it is an object
            if (typeof obj[property] == "object") {
                if (obj.hasOwnProperty(key)) {
                    return obj[key]; //return the value 
                }
            }
            else {
                iterate(obj[property]);
            }
        }   
    }

    return undefined;
}
Run Code Online (Sandbox Code Playgroud)

return在一个循环内调用,所以它会更有效率(希望如此......)。

1.有没有人准备好这个功能?这个不行。

2.有人知道要改变什么才能使它工作吗?

任何帮助,包括angular.js功能都会很棒。

谢谢。

fel*_*cho 7

你把事情颠倒了一点,你忘了将第二个参数传递给递归函数调用。此外,在这种情况下,不需要 return undefined,因为这是默认设置。

function iterate (obj, key) {
    var result;

    for (var property in obj) {
        if (obj.hasOwnProperty(property)) {
            // in case it is an object
            if (typeof obj[property] === "object") {
                result = iterate(obj[property], key);

                if (typeof result !== "undefined") {
                    return result;
                }
            }
            else if (property === key) {
                return obj[key]; // returns the value
            }
        }   
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:实际上,我们应该在检查值是否是可迭代对象之前检查属性是否等于键,如果我们正在寻找其值为对象的键。感谢@Catinodeh!

function iterate (obj, key) {
    var result;

    for (var property in obj) {
        if (obj.hasOwnProperty(property)) {
            if (property === key) {
                return obj[key]; // returns the value
            }
            else if (typeof obj[property] === "object") {
                // in case it is an object
                result = iterate(obj[property], key);

                if (typeof result !== "undefined") {
                    return result;
                }
            }
        }   
    }
}
Run Code Online (Sandbox Code Playgroud)