检查JS中是否设置了数组项

时间:2010-04-10 11:29:39

标签: javascript arrays isset

我有一个数组

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

我试过

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

但它似乎无法正常工作

我正在使用jquery,我不知道它是否可以提供帮助

由于

9 个答案:

答案 0 :(得分:51)

使用in关键字测试是否在对象中定义了属性

if (assoc_var in assoc_pagine)

OR

if ("home" in assoc_pagine)

这里有很多问题。

首先,var假设变量的值是“home”,“work”还是“about”?或者你的意思是检查名为“var”的实际财产?

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

assoc_var

如果您打算检查名为“var”的属性,那么您只需将其放在引号内。

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

然后,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") 

答案 1 :(得分:12)

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)

答案 2 :(得分:6)

var是一个声明......所以它是一个保留字......所以只需用另一种方式调用它。 这是一种更好的方法(===优于==)

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

答案 3 :(得分: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
};

答案 4 :(得分: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'之类的字符串不会解析。)

此外,检查不存在的数组元素或对象属性的确定为undefined,但实际上并没有告诉您尚未设置数组元素或对象属性。例如,undefined也是通过调用不以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();

如果您想使用关联数组,最好使用简单对象,因为其他答案已经推荐。

答案 5 :(得分:1)

if (assoc_pagine.indexOf('home') > -1) {
   // we have home element in the assoc_pagine array
}

Mozilla indexOf

答案 6 :(得分:1)

这对我有用

import json
import sys
from pprint import pprint

jdata = open(sys.argv[1])

data = json.load(jdata)

代替这个

if (assoc_pagine[var] != undefined) {

答案 7 :(得分:0)

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

alert( isset("key_search") );

答案 8 :(得分:0)

最有效的方式:

if (array.indexOf(element) > -1) {
   alert('Bingooo')
}

W3Schools