Подтвердить что ты не робот

Проверьте, установлен ли элемент массива в JS

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

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

Я пробовал

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

но он не работает

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

Спасибо

4b9b3361

Ответ 1

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

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

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

Ответ 2

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)

Ответ 3

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

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

Ответ 4

Это не массив. Лучше объявите это следующим образом:

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
};

Ответ 5

TL;DR; Лучшее, что я могу придумать, это следующее: (В зависимости от вашего варианта использования существует несколько способов оптимизации этой функции.)

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. (Я использовал хром, каждый комментарий указывает на оцениваемое значение строки перед ним.);

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

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

Ответ 6

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

alert( isset("key_search") );