Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/412.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 测试动态对象是否有空字段的正确方法?_Javascript - Fatal编程技术网

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

Javascript 测试动态对象是否有空字段的正确方法?,javascript,Javascript,我正在研究动态结构,作为一个基本示例: var myObj = { "fruits" : { "apples" : { "color" : "red", "price" : "$0.49" } }, "colors" : {} }; 因此,我预计,例如,水果“橙色”并不存在。我想测试它是否不存在,以便添加它 我在控制台中看到,如果您试图访问一个不存在的“对象”,就会被告知“未定义” 这就是我要寻找的,但我不希望控制台中出现错误,我想知道/预测

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

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
}

我通过自己的测试意识到,这将产生错误,而不是像上面的apple weight console日志演示那样未定义的错误。如果要测试对象上是否存在属性,可以使用
对象。prototype.hasOwnProperty()

您应该检查第一个可能不存在的属性:因此在确定
couch
存在之前,不要检查
couch.color
属性

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

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

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

第一个,最简单的,就是简单地做

if(!myObj.fruits.cononut)
    // do stuff
但是,这不是很安全,因为它“执行任务”,例如,即使
.couch
false

人们通常做的是

if(typeof myObj.fruits.cononut === "undefined")
      // do stuff
检查字段是否实际不存在且未设置(
==
还检查相同类型)

然而,这一次我认为你可以尝试一下(没有深入测试):

这将检查密钥是否存在

编辑


正如@hackerrdave指出的,您还可以使用
.hasOwnProperty
方法。

下划线js包含\uhas

_.has(对象、键) 对象是否包含给定的键?与object.hasOwnProperty(键)相同,但使用对hasOwnProperty函数的安全引用,以防意外重写


显然,hackerrdave的答案就足够了,但如果您使用的是下划线,那么就稍微简单一些。

if(myObj.fruits.cocoil==void 0)。。。。。或如果(typeof myObj.fruits.couch==“undefined”),您应该检查第一个可能不存在的属性,如果它应该是一个对象(这是您的情况),那么您可以使用
执行此操作运算符<代码>如果(!myObj.fruits.couch)myObj.fruits.couch={color:'brown'}我考虑了如何判断未定义的是字符串还是“保留的单词”,我甚至还没有到这一点,我想在控制台中找到一个返回“未定义”的测试,而不是一个红色错误,比如“unType Type Error……不能转换…”等等。我看到这是用于内置键值对的,使用的是普通JavaScript,您已经可以在obj中编写
key
。使用库来实现这一点似乎有点过火,但仍然要编写至少与它一样长的东西(
(obj,key)
)。我想我会尝试这种方法或HackerDave提到的方法!obj.subobj方法实际上不起作用,它适用于那个案例。我不确定出了什么问题,但感谢您提供的选项。实际上,我的问题似乎是使用字符串尝试访问对象属性。HMM你能举一个“使用字符串尝试访问对象属性”的例子吗?事实上,对于我来说,传递字符串访问方法是一个愚蠢的问题/错误,你必须把它放在括号中,例如myObj['fruits']['couch']用于对象的动态访问。
if(typeof myObj.fruits.cononut === "undefined")
      // do stuff
if(!("cononut" in myObj.fruits))
    // do stuff
_.has({a: 1, b: 2, c: 3}, "b");
=> true