Javascript 检查嵌套对象中是否存在对象成员

Javascript 检查嵌套对象中是否存在对象成员,javascript,object,Javascript,Object,有没有比在object中使用\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu 更简洁地说:如何检查someObject.member.member.member.value是否存在?类似(警告:未测试的代码) var testProperty=function(obj,proplist){ 对于(变量i=0;i

有没有比在object中使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

更简洁地说:如何检查someObject.member.member.member.value是否存在?

类似(警告:未测试的代码)

var testProperty=function(obj,proplist){
对于(变量i=0;i
或类似地:

var val = foo.bar && foo.bar.jim && foo.bar.jim.jam && foo.bar.jim.jam.value;
如果任何特定值恰好为
null
false
0
、或
(空字符串),则此操作将不起作用,但除了最终值之外,情况似乎不太可能如此


另外,请注意,
typeof“undefined”
不是查看对象是否具有属性的正确测试。相反,您应该在对象
中使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。这是因为您可以将属性设置为显式值
undefined
,这与使用
delete someObject.member

删除它不同。通常,如果(对象中的属性)
,您可以使用
,但这对于嵌套成员来说仍然很麻烦

您可以编写一个函数:

function test(obj, prop) {
    var parts = prop.split('.');
    for(var i = 0, l = parts.length; i < l; i++) {
        var part = parts[i];
        if(obj !== null && typeof obj === "object" && part in obj) {
            obj = obj[part];
        }
        else {
            return false;
        }
    }
    return true;
}

test(someObject, 'member.member.member.value');
功能测试(obj、prop){
变量部分=项目拆分('.');
对于(变量i=0,l=parts.length;i
这里有一种方法:


您还可以尝试/捕获TypeError

try {
  console.log(someObject.member.member.member.value);
} catch(e) {
  if (e instanceof TypeError) {
    console.log("Couldn't access someObject.member.member.member.value");
    console.log(someObject);
  }
}

定义了一个safeRead函数,该函数允许安全读取嵌套属性 i、 e


如果任何属性为null或未定义,则返回一个空白字符串-用于格式化/字符串插值

请查看lodash deep的
deepHas


这也是如果您可以使用
lodash
库,它有一个非常优雅的解决方案,

_.hasIn(someObject, 'member.level1.level2.level3');
比如说,

var obj = {'x': 999, 'a': {'b': {'c': 123, 'd': 234}}}
// => undefined

_.hasIn(obj, 'x')
// => true

_.hasIn(obj, 'a.b.d')
// => true

_.hasIn(obj, 'a.b.e')
// => false

看起来不错。我喜欢循环方法,但是obj==“object”的类型究竟有什么帮助呢?typeof也可以为null和数组返回object,这不是真的吗?@JustcallmeDrago:true。。。不过,这对数组没有多大影响,但是对于
null
,它会失败。因此,最好也添加一个null检查。我添加了测试,因为
中的
'value'会抛出错误。添加了
null
test.@Felix:我明白了。我真的很喜欢字符串作为参数,但也喜欢Patrick答案的简单性。他的和你的一样安全吗?那么快吗?@JustcallmeDrago:他的可能更快。但最后一个值会有问题。他的代码的结果要么是
未定义
,要么是最后一个属性的值。如果设置为
undefined
,则无法区分。但假设您从未设置过这样的值,则应保存该值。老实说,我觉得读起来有点难,如果你想让它可重用,你会再次使用循环。。。但两者都可以。抱歉打断一下,但是。。。这里有人提到“Patrick的答案”更快。犯错误这个答案在哪里?:-@费利克斯——谢谢,修好了。另外,请参见Phrogz的答案,以了解HasownProperty的替代方案参见对我答案的评论,如果
obj
null
,您的答案也会失败。很好。当然,这可以很容易地转换为递归函数!我真的很喜欢这个解决方案
try {
  console.log(someObject.member.member.member.value);
} catch(e) {
  if (e instanceof TypeError) {
    console.log("Couldn't access someObject.member.member.member.value");
    console.log(someObject);
  }
}
safeRead(foo, 'bar', 'jim', 'jam');
_.hasIn(someObject, 'member.level1.level2.level3');
var obj = {'x': 999, 'a': {'b': {'c': 123, 'd': 234}}}
// => undefined

_.hasIn(obj, 'x')
// => true

_.hasIn(obj, 'a.b.d')
// => true

_.hasIn(obj, 'a.b.e')
// => false