测试动态对象是否有空字段的正确方法是什么?

时间:2016-12-27 14:05:20

标签: javascript

我正在研究一个动态结构,作为一个基本的例子:

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
}

我通过自己的测试意识到,这会产生错误,而不是像上面的苹果重量控制台日志演示那样未定义

4 个答案:

答案 0 :(得分:1)

您应该检查可能不存在的 first 属性:因此,在确定coconut.color存在之前,请不要检查coconut属性。

如果您检查的属性应该是一个对象(这是您的情况),那么您可以使用!运算符执行此操作:

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

答案 1 :(得分:0)

如果您想测试对象上是否存在属性,可以使用Object.prototype.hasOwnProperty()

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

答案 2 :(得分: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方法。

答案 3 :(得分:0)

下划线js包含 _。有 link

  

_。有(对象,键)   对象是否包含给定的键?与object.hasOwnProperty(key)相同,但是如果它被意外覆盖,则使用对hasOwnProperty函数的安全引用。

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

显然,hackerrdave回答就足够了,但是如果你使用了下划线,那么它就会稍微简单一些。