Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/413.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从深度对象获取属性值 我的目标是:创建一种从多级javascript对象获取属性值的方法。_Javascript - Fatal编程技术网

从深度对象获取属性值 我的目标是:创建一种从多级javascript对象获取属性值的方法。

从深度对象获取属性值 我的目标是:创建一种从多级javascript对象获取属性值的方法。,javascript,Javascript,例如,我想从以下对象获取属性值: var originalCookieObject = { User: "notmyemail@gmail.com", GridStates: { gridName : { "page": 1, "pageSize": 50, "sort": [ {

例如,我想从以下对象获取属性值:

var originalCookieObject = {
        User: "notmyemail@gmail.com",
        GridStates: {
            gridName : {
                "page": 1,
                "pageSize": 50,
                "sort": [
                            {
                                field: "CommonName",
                                dir: "desc"
                            }
                        ]
            }
        },
        ProtectionState: {
            SelectedRow: "string",
            PanelsOpen: ['string', 'string']
        }
    }
下面是我如何检索属性值的方法:

getProperty(originalCookieObject, 'gridName');
到目前为止,我已经尝试了以下递归函数:

function traverse(toTraverse, findKey) {
    if( typeof toTraverse == "object" ) {
        var foundValue = toTraverse[findKey];
        if (foundValue){ return foundValue; }

        $.each(toTraverse, function(k,v) {
            // k is either an array index or object key
            traverse(v, findKey);
        });
    }
}
var objectValue = traverse(originalCookieObject, 'gridName');
console.log(objectValue);
我的问题是,当我尝试深入到多个级别时,当前的
traverse()
调用仅将属性值返回给父
traverse()
调用

我的问题是:

  • 如何使子
    traverse()
    调用将属性值返回给父
    traverse()
    函数
  • 有更好的方法吗
  • 您就快到了,只需要将嵌套遍历调用的结果分配给一个var,然后在函数末尾返回它

    您就快到了,只需要将嵌套遍历调用的结果分配给一个var,然后在函数末尾返回它

    您就快到了,只需要将嵌套遍历调用的结果分配给一个var,然后在函数末尾返回它

    您就快到了,只需要将嵌套遍历调用的结果分配给一个var,然后在函数末尾返回它


    您需要检查是否有返回值,然后将其存储在变量中:

    function traverse(toTraverse, findKey) {
        if( typeof toTraverse == "object" ) {
            var foundValue = toTraverse[findKey];
            if (foundValue){ return foundValue; }
            var returnVal;
            $.each(toTraverse, function(k,v) {
                // k is either an array index or object key
               returnVal = traverse(v, findKey) || returnVal; //set/overwrite the returnVal if there is one
            });
            return returnVal; //return the value to parent, parent will return it further
        }
    }
    var objectValue = traverse(originalCookieObject, 'gridName');
    console.log(objectValue);
    

    因此,您总是返回一个值,
    undefined
    ,或者返回找到的值本身。这将一直持续到它返回顶部。实际值将始终用于
    未定义的

    您需要检查是否有返回值,然后将其存储在变量中:

    function traverse(toTraverse, findKey) {
        if( typeof toTraverse == "object" ) {
            var foundValue = toTraverse[findKey];
            if (foundValue){ return foundValue; }
            var returnVal;
            $.each(toTraverse, function(k,v) {
                // k is either an array index or object key
               returnVal = traverse(v, findKey) || returnVal; //set/overwrite the returnVal if there is one
            });
            return returnVal; //return the value to parent, parent will return it further
        }
    }
    var objectValue = traverse(originalCookieObject, 'gridName');
    console.log(objectValue);
    

    因此,您总是返回一个值,
    undefined
    ,或者返回找到的值本身。这将一直持续到它返回顶部。实际值将始终用于
    未定义的

    您需要检查是否有返回值,然后将其存储在变量中:

    function traverse(toTraverse, findKey) {
        if( typeof toTraverse == "object" ) {
            var foundValue = toTraverse[findKey];
            if (foundValue){ return foundValue; }
            var returnVal;
            $.each(toTraverse, function(k,v) {
                // k is either an array index or object key
               returnVal = traverse(v, findKey) || returnVal; //set/overwrite the returnVal if there is one
            });
            return returnVal; //return the value to parent, parent will return it further
        }
    }
    var objectValue = traverse(originalCookieObject, 'gridName');
    console.log(objectValue);
    

    因此,您总是返回一个值,
    undefined
    ,或者返回找到的值本身。这将一直持续到它返回顶部。实际值将始终用于
    未定义的

    您需要检查是否有返回值,然后将其存储在变量中:

    function traverse(toTraverse, findKey) {
        if( typeof toTraverse == "object" ) {
            var foundValue = toTraverse[findKey];
            if (foundValue){ return foundValue; }
            var returnVal;
            $.each(toTraverse, function(k,v) {
                // k is either an array index or object key
               returnVal = traverse(v, findKey) || returnVal; //set/overwrite the returnVal if there is one
            });
            return returnVal; //return the value to parent, parent will return it further
        }
    }
    var objectValue = traverse(originalCookieObject, 'gridName');
    console.log(objectValue);
    
    因此,您总是返回一个值,
    undefined
    ,或者返回找到的值本身。这将一直持续到它返回顶部。实际值将始终用于
    未定义的

    如何使子traverse()调用将属性值返回给父traverse()函数

    通过将“child”调用的返回值存储在变量中并返回它

    有更好的方法吗

    你必须递归地遍历这个结构。使用for…in会稍微容易一些,因为您可以直接从循环体返回,而不必使用中间变量

    但是,实施过程中的两个问题是:

  • 如果搜索的键具有falsy值(因为
    if(foundValue){…}
    ),则失败
  • 即使在找到值之后,您仍会继续查找(在您的情况下,您甚至不知道何时找到值,但其他答案都有这个问题)
  • 如果数据结构包含多个具有相同名称的键,则仅获取第一个键。这是否是一个问题取决于您使用的数据
  • 以下解决方案适用于1。和2.:

    function traverse(toTraverse, findKey) {
        if( typeof toTraverse == "object" ) {
            if (toTraverse.hasOwnPropert(findKey)) { // does object have this property?
                return toTraverse[findKey];
            }
            var foundValue;
    
            $.each(toTraverse, function(k,v) {
                var value = traverse(v, findKey);
                if (typeof value !== 'undefined') {
                    foundValue = value;
                    return false; // stop looking
                }
            });
    
            return foundValue;
        }
    }
    
    有关更多信息,请参阅

    警告:此解决方案仍然无法正确处理值
    未定义
    的属性(例如
    {foo:undefined}
    ),但在大多数情况下应该可以

    如何使子traverse()调用将属性值返回给父traverse()函数

    通过将“child”调用的返回值存储在变量中并返回它

    有更好的方法吗

    你必须递归地遍历这个结构。使用for…in会稍微容易一些,因为您可以直接从循环体返回,而不必使用中间变量

    但是,实施过程中的两个问题是:

  • 如果搜索的键具有falsy值(因为
    if(foundValue){…}
    ),则失败
  • 即使在找到值之后,您仍会继续查找(在您的情况下,您甚至不知道何时找到值,但其他答案都有这个问题)
  • 如果数据结构包含多个具有相同名称的键,则仅获取第一个键。这是否是一个问题取决于您使用的数据
  • 以下解决方案适用于1。和2.:

    function traverse(toTraverse, findKey) {
        if( typeof toTraverse == "object" ) {
            if (toTraverse.hasOwnPropert(findKey)) { // does object have this property?
                return toTraverse[findKey];
            }
            var foundValue;
    
            $.each(toTraverse, function(k,v) {
                var value = traverse(v, findKey);
                if (typeof value !== 'undefined') {
                    foundValue = value;
                    return false; // stop looking
                }
            });
    
            return foundValue;
        }
    }
    
    有关更多信息,请参阅

    警告:此解决方案仍然无法正确处理值
    未定义
    的属性(例如
    {foo:undefined}
    ),但在大多数情况下应该可以

    如何使子traverse()调用将属性值返回给父traverse()函数

    通过将“child”调用的返回值存储在变量中并返回它

    有更好的方法吗

    你必须递归地遍历这个结构。使用for…in会稍微容易一些,因为您可以直接从循环体返回,而不必使用中间变量

    但是,实施过程中的两个问题是:

  • 如果搜索的键具有falsy值(因为
    if(foundValue){…}
    ),则失败
  • 即使在找到值之后,您仍会继续查找(在您的情况下,您甚至不知道何时找到值,但其他答案都有这个问题)
  • 如果数据结构包含具有相同名称的多个键,则只能获取第一个键