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

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

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

пробовал

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

но это, кажется, не работает

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

спасибо

8 ответов


использовать 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;

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

не используйте Array для этого. Массивы предназначены для численно-индексированных списков. Просто используйте plain Object ({}).

о чем вы думаете с 'undefined' строка, наверное, так:

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

это (более или менее) то же самое говорит.

if (assoc_pagine[key]!==undefined)

однако, в любом случае это немного некрасиво. Вы разыменовываете ключ, который может не существовать (что было бы ошибкой на любом более разумном языке), и полагаетесь на странный JavaScript hack давая вам специальный undefined значение для несуществующих свойств.

это также не совсем говорит вам, если свойство действительно не там, или если он был там, но явно установлен в undefined значение.

это более явный, читаемый и Имо всесторонний лучший подход:

if (key in assoc_pagine)

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

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

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

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

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 используют только "числовые" ключи. Когда вы устанавливаете "ассоциативный ключ" в массиве, вы фактически устанавливаете свойство для этого объекта массива, а не элемент этого массива. Например, это означает, что "ассоциативный ключ" не будет повторяться при использовании массива.forEach () и не будет включен при вычислении массива.длина. (Исключение для это строки вроде '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 ();

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


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

Mozilla indexOf


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

alert( isset("key_search") );

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

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

W3Schools