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