检查元素是否存在于JS对象中

时间:2016-01-10 02:44:57

标签: javascript

我想检查一下"键"存在于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".
}

3 个答案:

答案 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}}