Проверьте, установлен ли элемент массива в JS - PullRequest
26 голосов
/ 10 апреля 2010

У меня есть массив

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

Я пытался

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

но, похоже, не работает

Я использую jquery, я не знаю, может ли это помочь

Спасибо

Ответы [ 9 ]

53 голосов
/ 10 апреля 2010

Используйте ключевое слово 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") 

обновление: Как указали другие ответы, использование массива - не лучшее решение для этой проблемы. Попробуйте вместо этого использовать Object .

var assoc_pagine = new Object();
assoc_pagine["home"]=0;
assoc_pagine["about"]=1;
assoc_pagine["work"]=2;
12 голосов
/ 10 апреля 2010
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)
6 голосов
/ 10 апреля 2010

var - это утверждение ... так что это зарезервированное слово ... Так что просто назовите его по-другому. И это лучший способ сделать это (=== лучше, чем ==)

if(typeof array[name] !== 'undefined') {
    alert("Has var");
} else {
    alert("Doesn't have var");
}
3 голосов
/ 10 апреля 2010

Это не массив. Лучше объявите это так:

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
};
1 голос
/ 22 февраля 2019

Это сработало для меня

if (assoc_pagine[var] != undefined) {

вместо этого

if (assoc_pagine[var] != "undefined") {
1 голос
/ 09 апреля 2018
if (assoc_pagine.indexOf('home') > -1) {
   // we have home element in the assoc_pagine array
}

Индекс MozillaOf

1 голос
/ 04 января 2015

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 ();

Если вы хотите использовать ассоциативные массивы, вам лучше использовать простые объекты, как рекомендовали другие ответы.

0 голосов
/ 30 апреля 2018

Самый эффективный способ:

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

W3Schools

0 голосов
/ 18 декабря 2013
function isset(key){
ret = false;
array_example.forEach(function(entry) {
  if( entry == key ){
    ret = true;
  }
});
return ret;
}

alert( isset("key_search") );
...