Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.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 字符串';特性.尺寸.长度和x27;要访问哈希{属性:{维度:{长度:23}}_Javascript_Node.js - Fatal编程技术网

Javascript 字符串';特性.尺寸.长度和x27;要访问哈希{属性:{维度:{长度:23}}

Javascript 字符串';特性.尺寸.长度和x27;要访问哈希{属性:{维度:{长度:23}},javascript,node.js,Javascript,Node.js,JavaScript:给定一个字符串数组: ['properties.dimensions.length', 'properties.name'] 在散列中使用这些来验证或访问它们(实际上只是想验证密钥是否存在)的最佳方法是什么 我曾考虑过字符串拆分('.'),但我还不能真正理解如何使用每个数组值来验证或访问散列中的值 比如['properties'、'dimensions'、'length'],然后对每个属性进行深入研究,但理想情况下,我希望将其转换为等价的代码: myProperties

JavaScript:给定一个字符串数组:

 ['properties.dimensions.length', 'properties.name']
在散列中使用这些来验证或访问它们(实际上只是想验证密钥是否存在)的最佳方法是什么

我曾考虑过字符串拆分('.'),但我还不能真正理解如何使用每个数组值来验证或访问散列中的值

比如['properties'、'dimensions'、'length'],然后对每个属性进行深入研究,但理想情况下,我希望将其转换为等价的代码:

myProperties['properties']['dimensions']['length']

但是,如果这是一个完全黑客的方法,请随意说。。。而且要友善-你可以试试这样的方法:

function hasProperty(obj, props) {
    if (typeof props === "string") 
        return hasProperty(obj, props.split("."));
    for(var i = 0; i < props.length; i++) {
        if (props[i] in obj) 
            obj = obj[props[i]];
        else 
            return false;
    }

    return true;
}
var propPath = 'properties.dimensions.length';
console.log(hasProperty(myProperties, propPath));

这里有一个递归的替代方案:

function hasProperty(obj, props) {
    if (typeof props === "string") 
        return hasProperty(obj, props.split('.'));
    return props.length == 0 || props[0] in obj && hasProperty(obj[props.shift()], props);
}

var propPath = 'properties.dimensions.length';
console.log(hasProperty(myProperties, propPath));

您可以尝试以下方法:

function hasProperty(obj, props) {
    if (typeof props === "string") 
        return hasProperty(obj, props.split("."));
    for(var i = 0; i < props.length; i++) {
        if (props[i] in obj) 
            obj = obj[props[i]];
        else 
            return false;
    }

    return true;
}
var propPath = 'properties.dimensions.length';
console.log(hasProperty(myProperties, propPath));

这里有一个递归的替代方案:

function hasProperty(obj, props) {
    if (typeof props === "string") 
        return hasProperty(obj, props.split('.'));
    return props.length == 0 || props[0] in obj && hasProperty(obj[props.shift()], props);
}

var propPath = 'properties.dimensions.length';
console.log(hasProperty(myProperties, propPath));

+1,尽管我认为递归函数会更短、更简单readable@uʍopǝpısdn为funIt works添加了一个递归版本!非常好。你在我提交之前就回答了!你在国家安全局工作还是什么-非常感谢@安德鲁瓦克:前几天我回答了一个问题。我试图以复制的方式关闭,但简单地测试属性的存在性(而不是获取/设置值)就足够不同了,因此我觉得它保证了它自己的答案。+1,尽管我认为递归函数会更短、更简单readable@uʍopǝpısdn为funIt works添加了一个递归版本!非常好。你在我提交之前就回答了!你在国家安全局工作还是什么-非常感谢@安德鲁瓦克:前几天我回答了一个问题。我很想以复制品的形式关闭,但简单地测试一个属性的存在性(而不是获取/设置值)就足够不同了,我觉得它有理由给出自己的答案。