从深度对象获取属性值 我的目标是:创建一种从多级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()
函数您需要检查是否有返回值,然后将其存储在变量中:
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会稍微容易一些,因为您可以直接从循环体返回,而不必使用中间变量
但是,实施过程中的两个问题是:
if(foundValue){…}
),则失败李>
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会稍微容易一些,因为您可以直接从循环体返回,而不必使用中间变量
但是,实施过程中的两个问题是:
if(foundValue){…}
),则失败李>
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会稍微容易一些,因为您可以直接从循环体返回,而不必使用中间变量
但是,实施过程中的两个问题是:
if(foundValue){…}
),则失败李>