2011-08-28 64 views
0

今天我试着缩短if语句是这样的:感实性字符串与键

if (fruit == "apple" || type == "pear" || type == "orange"){

这样:

if (fruit in ["apple", "pear", "orange"]){

它不工作。乔纳森·斯努克有不同的解决方案here在那里他主要是靠地图是这样,它不工作:

if(fruit in {"apple":"", "pear":"", "orange":""}){

为什么这项工作,我简单的数组不,当通常在Javascript对象的存在使得该对象返回true?字符串是不同于对象的不同类型的对象吗?我认为字符串在我的数组中的存在也会返回true。

y = "Stackoverflow"; 
y && console.log('y is true') // y returns true, so console logs the message 

我将我的原始解决方案解释为“如果变量水果的值在这个数组中”。显然并非如此。它是否会说“如果变量水果本身在这个数组中?”不,因为这不起作用或者:

if (fruit in [fruit, "apple", "pear", "orange"]){

那么,什么是斯努克的版本与键=>值映射问这是正确的?我最好的猜测是,“如果这张地图中变量水果的名称下的一个关键字返回true?”

回答

4

x in y回报true如果对象y有名称x(所以是的,你的猜测是正确的)的属性。

数组也是对象。数组的属性是索引,它们是数字。这工作:

if(0 in ["apple", "pear", "orange"]) 

,因为该数组在索引0索引。该阵列是类似(但不一样的!)到该对象:

{0: "apple", 1: "pear", 2:"orange"} 

(当然阵列具有其它属性,如lengthpushslice等)

在你的对象例如({"apple":"", "pear":"", "orange":""}),apple, pear等是属性的对象,而不是属性的值。

如何找出是否是一个eleme nt被包含在一个数组中被描述在How do I check if an array includes an object in JavaScript?中。


†:严格来说,每一个属性是一个字符串,所以即使您使用数字(因为它与阵列的情况下),它们被转换为字符串。

+0

对,但我想检查一个变量的值与数组中的字符串。你的陈述永远是真实的,但“水果”可能不是苹果,梨或橙。 –

+1

我不明白你的观点。你想知道为什么它不起作用,我回答了。你可以用'5'代替'0',它会返回'false'。 –

+0

是的,我明白了,我认为你是在暗示你的代码是我的另一种选择,但是我现在明白你只是提出了一个观点。谢谢 –

2

要检查的值是数组内,使用indexOf

if (["apple", "pear", "orange"].indexOf(fruit) != -1){ 

注: IE < 9不支持在阵列indexOf,但可以add support easily

+1

这是一个很好的策略,但是你的意思是'indexOf(fruit)',而不是'indexOf('fruit')'不是吗? –

+0

@Artur Sapek:对。谢谢。 –