2010-04-10 75 views
20

设置我有一个数组检查数组项目在JS

var assoc_pagine = new Array(); 
    assoc_pagine["home"]=0; 
    assoc_pagine["about"]=1; 
    assoc_pagine["work"]=2; 

我试图

if (assoc_pagine[var] != "undefined") { 

,但它似乎没有工作

我使用jquery,我不知道它是否可以帮到

谢谢

+2

javascript中的数组不使用关联键。在数组上设置“关联键”时,实际上是在该数组对象上设置一个属性,而不是该数组的一个元素。这意味着使用Array.forEach()时,“关联键”不会被迭代,并且在计算Array.length时不会被包含。如果你想“关联数组”使用下面提到的对象。如果你想看看一个对象是否有属性,请参阅这个答案:http://stackoverflow.com/questions/135448/how-do-i-check-if-an-object-has-a-property-in- javascript – Omn 2015-01-04 03:19:08

回答

39

使用in关键字测试如果一个属性在一个对象

if (assoc_var in assoc_pagine) 

OR

if ("home" in assoc_pagine) 

这里有相当多的问题定义。

首先,是var假定变量的值为“home”,“work”或“about”?或者你是否想要检查名为“var”的实际属性?

如果var应该是一个具有字符串值的变量,请注意,var是JavaScript中的保留字,您需要使用其他名称,例如assoc_var

var assoc_var = "home"; 
assoc_pagine[assoc_var] // equals 0 in your example 

如果您打算检查名为“var”的属性,那么您简单地需要将它放在引号内。

assoc_pagine["var"] 

然后,undefined是不一样的"undefined"。您将需要typeof以获取对象类型的字符串表示形式。

这是所有步骤的细分。

var assoc_var = "home"; 
var value = assoc_pagine[assoc_var]; // 0 
var typeofValue = typeof value; // "number" 

因此,要解决您的问题

if (typeof assoc_pagine[assoc_var] != "undefined") 

更新:至于其他的答案表明,使用阵列是不是这个问题的最佳sollution。考虑使用对象代替。

var assoc_pagine = new Object(); 
assoc_pagine["home"]=0; 
assoc_pagine["about"]=1; 
assoc_pagine["work"]=2; 
+0

*“'var'是JavaScript中的保留字”*应该是第一个 – jozxyqk 2013-12-07 09:21:19

+0

@jozxqk,固定。和一些清理。 – Stefan 2014-01-28 09:21:57

+3

-1这是一团糟。真的很难从中得到答案。我想知道的是如何检查是否在Javascript中设置了数组项。这是我寻找的答案,这是一个非常低质量的答案。 – 2014-03-25 04:47:04

5

var是一个语句...所以这是一个保留字......所以只是把它的另一种方式。 这就是做一个更好的方式(===比==更好)

if(typeof array[name] !== 'undefined') { 
    alert("Has var"); 
} else { 
    alert("Doesn't have var"); 
} 
+0

有人能解释我为什么我是-2吗? – xavierm02 2010-04-10 17:01:23

+0

同样的答案,同样的问题。大声笑..我猜他们不喜欢简单的答案... – Stefan 2010-09-05 08:21:03

+0

+1感谢您的简单回答 – 2014-03-25 04:47:29

11
var assoc_pagine = new Array(); 
assoc_pagine["home"]=0; 

不要使用此一Array。数组用于数字索引列表。只需使用普通的Object{})。

你所用'undefined'串想着大概是这样的:

if (typeof assoc_pagine[key]!=='undefined') 

这话说

if (assoc_pagine[key]!==undefined) 

然而,无论哪种方式,这是一个有点(或多或少)相同丑陋。您正在取消引用可能不存在的关键字(这在任何更明智的语言中都是错误的),并且依赖于JavaScript的奇怪黑客手段,为您提供不存在的属性的特殊undefined值。

这也不完全告诉你,如果属性真的不是那里,或者如果它存在但明确设置为undefined值。

这是一个更加明确,可读性和IMO全方位的更好的方法:

if (key in assoc_pagine) 
+0

似乎解决了使用数组作为关联数组的明显问题的唯一答案。 +1 – James 2010-04-10 12:10:02

+0

(之前说过,它*做*工作,因为Array是Object的一个子类,除了在原型上加载更多属性可能会与之冲突之外,它并没有给你任何东西。 – bobince 2010-04-10 12:32:27

+0

你想使用'hasOwnProperty'not'in',因为'in'也检查继承的属性。 (例如{}中的hasOwnProperty === true) – Omn 2015-01-21 20:19:03

3

这不是一个数组。 更好的声明这样说:

var assoc_pagine = {}; 
assoc_pagine["home"]=0; 
assoc_pagine["about"]=1; 
assoc_pagine["work"]=2; 

var assoc_pagine = { 
       home:0, 
       about:1, 
       work:2 
       }; 

要检查的对象包含了一些标签,你只需做这样的事情:

if('work' in assoc_pagine){ 
    // do your thing 
}; 
+0

哎呀,忽略Bobinces的答案,它告诉你所有并且比你想知道的更多 – KooiInc 2010-04-10 15:18:37

+0

这个答案确实解决了OP所需的使用情况,但是你想使用'hasOwnProperty ''in'since'也会检查继承的属性。 (例如{}中的hasOwnProperty === true) – Omn 2015-01-21 20:13:39

0
function isset(key){ 
ret = false; 
array_example.forEach(function(entry) { 
    if(entry == key){ 
    ret = true; 
    } 
}); 
return ret; 
} 

alert(isset("key_search")); 
+0

这根本不起作用。 – Omn 2015-01-04 06:47:58

1

TLDR;我能想出的最好的是这样的:(根据您的使用情况下,有许多的方法来优化该功能。)

function arrayIndexExists(array, index){ 
    if (typeof index !== 'number' && index === parseInt(index).toString()) { 
     index = parseInt(index); 
    } else { 
     return false;//to avoid checking typeof again 
    } 
    return typeof index === 'number' && index % 1===0 && index >= 0 && array.hasOwnKey(index); 
} 

对方回答的例子亲近,将一些工作(可能是最)的目的,但在技术上相当不正确,我下面解释的原因。

Javascript数组只使用'数字'键。在数组上设置“关联键”时,实际上是在该数组对象上设置一个属性,而不是该数组的一个元素。例如,这意味着当使用Array.forEach()时,“关联密钥”不会被迭代,并且在计算Array.length时不会被包含。 (例外是这样的字符串'0'将解析为数组的元素,但'0'字符串不会)。

此外,检查不存在的数组元素或对象属性会评估因为未定义,但实际上并没有告诉你数组元素或对象属性尚未设置。例如,未定义也是通过调用不以return语句终止的函数得到的结果。这可能会导致一些奇怪的错误和难以调试的代码。

这可能令人困惑,但可以使用浏览器的javascript控制台轻松探索。 (我使用了chrome,每个注释都表示它之前的行的评估值)。

var foo = new Array(); 
foo; 
//[] 
foo.length; 
//0 
foo['bar'] = 'bar'; 
//"bar" 
foo; 
//[] 
foo.length; 
//0 
foo.bar; 
//"bar" 

这表明关联键不用于访问数组中的元素,而是用于对象的属性。

foo[0] = 0; 
//0 
foo; 
//[0] 
foo.length; 
//1 
foo[2] = undefined 
//undefined 
typeof foo[2] 
//"undefined" 
foo.length 
//3 

这表明检查typeof不允许您查看是否设置了元素。

var foo = new Array(); 
//undefined 
foo; 
//[] 
foo[0] = 0; 
//0 
foo['0'] 
//0 
foo[' 0'] 
//undefined 

这说明我上面提到的例外,为什么你不能只使用parseInt函数();

如果你想使用关联数组,你最好使用简单的对象作为其他答案的建议。