我想检查一下"键"存在于JS对象中。有办法做到这一点吗? +数据可以是sometree中的任意子分支
示例:
var sometree = {
foo : {
data : 1
},
foo2 : {
data : 5
}
}
function checkForKey(key, obj) {
//If I do "checkForKey(5, sometree)", I want the function
//to return "sometree.foo2.data".
}
答案 0 :(得分:-1)
如果对象可以是任意深度,则需要递归的东西:
var sometree = {
foo: {
data: 1
},
foo2: {
data: 5
}
}
function checkForValue( value, json, name ) {
var result = checkObject( value, json );
return result ? name +'.'+ result : null;
}
function checkObject( value, json ) {
var keys = Object.keys(json);
for ( var i = 0; i < keys.length; i++ ) {
var key = keys[i];
if ( typeof json[key] === 'object' && json[key] !== null ) {
var result = checkObject( value, json[key] );
if ( result )
return key +'.'+ result;
}
else if ( json[key] === value ) {
return key;
}
}
return null;
}
document.write( checkForValue( 5, sometree, 'sometree' ) );
答案 1 :(得分:-2)
getDeepKeyForValue
功能可以在“只给我一个”形式或“给我所有这些”中实现。你也可以要求它支持复杂的对象,但是我写了一些来支持简单的值。注意:因为密钥中可以包含'.'
,所以我会返回密钥路径的Array
,让您处理这些极端情况。您也无法从函数中恢复sometree
标识/变量名称。这将有效......:
function getDeepKeyForValue (value, object, path) {
var keySet = Object.keys(object || {});
var key;
var result;
path = path || [];
keySetLength = keySet.length;
while (keySetLength--) {
key = keySet[keySetLength];
if (value === object[key]) {
return path.concat(key);
}
result = getDeepKeyForValue(value, object[key], path.concat(key));
if (result) {
return result;
}
}
return null;
}
答案 2 :(得分:-3)
以下应该工作:
{{1}}