2016-12-27 44 views
-1

我工作的动态结构,作为一个基本的例子:测试动态对象是否有空字段的正确方法?

var myObj = { 
    "fruits" : { 
    "apples" : { 
     "color" : "red", 
     "price" : "$0.49" 
    } 
    }, 
    "colors" : {} 
}; 

所以我期待的是,例如水果,“橙色”不存在。我想测试它不存在,所以我可以添加它。

我在控制台中看到,如果您尝试访问不存在的“对象”,则会被告知“未定义”。

这就是我正在寻找的,但我不想在控制台中的错误,我想知道/预计它是空的,所以我可以添加到它。

如果我这样做

console.log(myObj.fruits.apples.color); 

我会得到红色,因此,如果我这样做是为了橙色

console.log(myObj.fruits.orange.color); 

它会说不确定的,至少如果我试图

console.log(myObj.fruits.apples.weight); 

这应该是未定义的,我的jsfiddle没有这么热,我现在无法再现那个未定义的console.log消息

好吧,所以似乎提供的对象存在,你可以测试一个未定义的属性,如上面的重量示例。

我不是在寻找那个,我正在测试像“椰子”这样的对象是否不存在,所以我可以使用extend将它添加到对象数组中。但我不想红控制台日志错误,我希望能够使用类似的比较来预测它:

if (myObj.fruits.coconut === "undefined") { 
    // means it doesn't exist, add it 
} 

我用我自己的测试实现,这将产生误差,而不是未定义像上述

+0

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof – deceze

+0

if(myObj.fruits.coconut === void 0).....或.. .... if(typeof myObj.fruits.coconut ===“undefined”) – Kenny

+0

你应该检查可能不存在的* first *属性,如果它应该是一个对象(这是你的情况),那么你可以如果(!myObj.fruits.coconut)myObj.fruits.coconut = {color:'brown'};' – trincot

回答

1

您应检查第一财产可能不EXI st:因此在确定coconut存在之前,请不要检查coconut.color属性。

如果选中的属性应该是一个对象(这是你的情况下),那么你可以用!运营商这样做:

if (!myObj.fruits.coconut) myObj.fruits.coconut = { color: 'brown' }; 
0

如果你想测试一个属性的对象上存在苹果重量控制台日志演示中,你可以使用Object.prototype.hasOwnProperty()

myObj.fruits.hasOwnProperty("apples") //true 
myObj.fruits.hasOwnProperty("oranges") //false 
+0

感谢您的信息,我看到这是用于内置的键值对 –

0

正如有人在评论中指出的,你至少有两个方法。

第一位的,最简单的,是简单地做

if(!myObj.fruits.cononut) 
    // do stuff 

但是因为它“做的东西”即使.coconutfalse,例如这是不是很安全。

人们通常不会是

if(typeof myObj.fruits.cononut === "undefined") 
     // do stuff 

来检查,如果该字段实际上不存在,并且未设置(===还检查同一类型)。

然而,这个时候,我想你能永远与此尝试(不深入的检验):

if(!("cononut" in myObj.fruits)) 
    // do stuff 

,检查为重点是否存在等。

编辑

由于@hackerrdave指出的那样,你也可以用.hasOwnProperty方法。

+0

我想我会尝试这种方法或hackerrdave提到的!obj.subobj方法实际上没有工作,它为那个工作案件。不知道出了什么问题,但谢谢你的选择。 –

+0

其实我的问题似乎是使用字符串来尝试访问对象属性。嗯 –

+0

你可以举一个“使用字符串来尝试和访问一个对象属性”的例子吗? –

0

下划线JS包含_.haslink

_.has(对象键) 是否该对象包含给定的关键?与object.hasOwnProperty(key)相同,但对hasOwnProperty函数使用安全引用,以防意外覆盖。

_.has({a: 1, b: 2, c: 3}, "b"); 
=> true 

显然,hackerrdave答案是足够了,但如果你使用underscorejs那么它是稍微简单一些。

+0

用普通的JavaScript,你已经可以在'obj'中编写'key'。对于这个库使用一个库似乎有点矫枉过正,并且仍然至少写出与(_has。(obj,key)')一样长的东西。 – trincot

相关问题