36

我有一个数组

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

我试过了

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

但它似乎不起作用

我正在使用jquery,我不知道它是否有帮助

谢谢

4

9 回答 9

72

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

if (assoc_var in assoc_pagine)

或者

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") 

更新:正如其他答案所表明的那样,使用数组并不是解决此问题的最佳方法。考虑改用对象

var assoc_pagine = new Object();
assoc_pagine["home"]=0;
assoc_pagine["about"]=1;
assoc_pagine["work"]=2;
于 2010-04-10T11:31:37.527 回答
16
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)
于 2010-04-10T11:52:19.567 回答
9

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

if(typeof array[name] !== 'undefined') {
    alert("Has var");
} else {
    alert("Doesn't have var");
}
于 2010-04-10T11:39:47.887 回答
3

This is not an Array. Better declare it like this:

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

or

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

To check if an object contains some label you simply do something like this:

if('work' in assoc_pagine){
   // do your thing
};
于 2010-04-10T15:07:39.127 回答
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 也是您通过调用不以 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();

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

于 2015-01-04T06:49:16.953 回答
1

这对我有用

if (assoc_pagine[var] != undefined) {

而是这个

if (assoc_pagine[var] != "undefined") {
于 2019-02-22T06:59:09.133 回答
1
if (assoc_pagine.indexOf('home') > -1) {
   // we have home element in the assoc_pagine array
}

Mozilla 索引

于 2018-04-09T14:45:25.973 回答
0
function isset(key){
ret = false;
array_example.forEach(function(entry) {
  if( entry == key ){
    ret = true;
  }
});
return ret;
}

alert( isset("key_search") );
于 2013-12-18T13:28:35.833 回答
0

最有效的方法:

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

W3学校

于 2018-04-30T12:02:39.377 回答