Вопрос: Проверка наличия ключа в объекте JavaScript?


Как проверить, существует ли какой-либо конкретный ключ в объекте или массиве JavaScript?

Если ключ не существует, и я пытаюсь получить к нему доступ, он вернет false? Или выбросить ошибку?


2187


источник


Ответы:


Проверка неопределенности не является точным способом проверки наличия ключа. Что, если ключ существует, но значение на самом деле undefined?

var obj = { key: undefined };
obj["key"] != undefined // false, but the key exists!

Вместо этого вы должны использовать inоператор:

"key" in obj // true, regardless of the actual value

Если вы хотите проверить, нет ли ключа, не забудьте использовать скобки:

!("key" in obj) // true if "key" doesn't exist in object
!"key" in obj   // ERROR!  Equivalent to "false in obj"

Или, если вы хотите особенно проверить свойства экземпляра объекта (и не унаследованные свойства), используйте hasOwnProperty:

obj.hasOwnProperty("key") // true

Для сравнения производительности между методами, которые in, hasOwnPropertyи ключ undefined, видеть это эталонный тест


3011



быстрый ответ

Как проверить, существует ли какой-либо конкретный ключ в объекте или массиве JavaScript?   Если ключ не существует, и я пытаюсь получить к нему доступ, он вернет false? Или выбросить ошибку?

Доступ непосредственно к отсутствующему свойству с использованием (ассоциативного) стиля массива или стиля объекта возвращает не определено постоянная.

Медленная и надежная в оператора и hasOwnProperty метод

Как уже упоминалось здесь, у вас может быть объект со свойством, связанным с константой «undefined».

 var bizzareObj = {valid_key:  undefined};

В этом случае вам придется использовать hasOwnProperty или в чтобы узнать, действительно ли ключ. Но, но по какой цене?

так, я говорю вам ...

в оператора и hasOwnProperty являются «методами», которые используют механизм дескриптора свойства в Javascript (аналогично отражению Java на языке Java).

http://www.ecma-international.org/ecma-262/5.1/#sec-8.10

Тип дескриптора свойства используется для объяснения манипуляций и переопределения атрибутов именованного свойства. Значения типа дескриптора свойств - это записи, состоящие из именованных полей, где каждое имя поля является именем атрибута, а его значение является соответствующим значением атрибута, как указано в 8.6.1. Кроме того, любое поле может присутствовать или отсутствовать.

С другой стороны, вызов метода объекта или ключа будет использовать механизм Javascript [[Get]]. Это намного быстрее!

эталонный тест

http://jsperf.com/checking-if-a-key-exists-in-a-javascript-array

Comparing key access in JS,

С помощью в оператор
var result = "Impression" in array;

В результате

12,931,832 ±0.21% ops/sec      92% slower 
Использование hasOwnProperty
var result = array.hasOwnProperty("Impression")

В результате

16,021,758 ±0.45% ops/sec     91% slower
Доступ к элементам напрямую (стиль скобок)
var result = array["Impression"] === undefined

В результате

168,270,439 ±0.13 ops/sec     0.02% slower 
Прямой доступ к элементам (стиль объекта)
var result = array.Impression  === undefined;

В результате

168,303,172 ±0.20%     fastest

EDIT: В чем причина присвоения собственности undefinedстоимость?

Этот вопрос меня озадачивает. В Javascript существует не менее двух ссылок для отсутствующих объектов, чтобы избежать таких проблем: nullа также undefined,

nullявляется примитивным значением, которое представляет собой намеренное отсутствие какой-либо стоимости объекта или, в краткосрочной перспективе, подтвердил отсутствие ценности. С другой стороны, undefinedнеизвестное значение (не определено). Если есть свойство, которое будет использоваться позже с правильный значение считают использование nullвместо undefinedпотому что в начальный момент свойство подтвердил чтобы не иметь значения.

Для сравнения:

var a = {1: null}; 
console.log(a[1] === undefined); // output: false. I know the value at position 1 of a[] is absent and this was by design, i.e.:  the value is defined. 
console.log(a[0] === undefined); // output: true. I cannot say anything about a[0] value. In this case, the key 0 was not in a[].

Консультировать

Избегайте undefinedзначения. Проверяйте напрямую, когда это возможно, и используйте nullдля инициализации значений свойств. В противном случае используйте медленные inоператора или hasOwnProperty()метод.

EDIT: 12/04/2018 - НЕ СООТВЕТСТВУЕТ ЛЮБОЙ

Как отмечают люди, современные версии движков Javascript (с исключением firefox) изменили подход к свойствам доступа. Текущая реализация медленнее предыдущей для данного конкретного случая, но разница между ключом доступа и объектом пренебрежимо мала.


214



Он вернется undefined,

var aa = {hello: "world"};
alert( aa["hello"] );      // popup box with "world"
alert( aa["goodbye"] );    // popup box with "undefined"

undefinedявляется специальным постоянным значением. Таким образом, вы можете сказать, например.

// note the three equal signs so that null won't be equal to undefined
if( aa["goodbye"] === undefined ) {
    // do something
}

Вероятно, это лучший способ проверить отсутствие ключей. Однако, как указано в комментарии ниже, теоретически возможно, что вы хотите, чтобы фактическое значение было undefined, Мне никогда не приходилось это делать, и я не могу думать о причине, почему я когда-либо хотел, но только ради полноты, вы можете использовать inоператор

// this works even if you have {"goodbye": undefined}
if( "goodbye" in aa ) {
    // do something
}

113



принятый ответ относится к объект , Остерегайтесь использования inоператор на массив для поиска данных вместо ключей:

("true" in ["true", "false"])
// -> false (Because the keys of the above Array are actually 0 and 1)

Чтобы проверить существующие элементы в массиве: Лучший способ найти элемент в массиве JavaScript?


21



Три способа проверить, присутствует ли свойство в объекте javascript:

  1. !! obj.theProperty
    Преобразует значение в bool. возвращает TRUE для всех, кроме значения «false»
  2. «Свойство» в obj
    Вернет true, если свойство существует, независимо от его значения (даже пустого)
  3. obj.hasOwnProperty ( 'theProperty')
    Не проверяет цепочку прототипов. (поскольку все объекты имеют метод toString, 1 и 2 вернут true, а 3 могут возвращать на него false).

Справка:

http://book.mixu.net/node/ch5.html


19



"key" in obj

Is likely testing only object attribute values that are very different from array keys


18



If you are using underscore.js library then object/array operations become simple.

In your case _.has method can be used. Example:

yourArray = {age: "10"}

_.has(yourArray, "age")

returns true

But,

_.has(yourArray, "invalidKey")

returns false


12



Here's a helper function I find quite useful

This keyExists(key, search) can be used to easily lookup a key within objects or arrays!

Just pass it the key you want to find, and search obj (the object or array) you want to find it in.

function keyExists(key, search) {
    if (!search || (search.constructor !== Array && search.constructor !== Object)) {
        return false;
    }
    for (var i = 0; i < search.length; i++) {
        if (search[i] === key) {
            return true;
        }
    }
    return key in search;
}

How to use it:

Searching for keys in Arrays

keyExists('apple', ['apple', 'banana', 'orange']); // true
keyExists('fruit', ['apple', 'banana', 'orange']); // false

Searching for keys in Objects

keyExists('age', {'name': 'Bill', 'age': 29 }); // true
keyExists('title', {'name': 'Jason', 'age': 29 }); // false

It's been pretty reliable and works well cross-browser.


8



Answer:

if ("key" in myObj)
{
    console.log("key exists!");
}
else
{
    console.log("key doesn't exist!");
}

Explanation:

The in operator will check if the key exists in the object. If you checked if the value was undefined: if (myObj["key"] === 'undefined'), you could run into problems because a key could possibly exist in your object with the undefined value.

For that reason, it is much better practice to first use the in operator and then compare the value that is inside the key once you already know it exists.


8



vanila js

yourObjName.hasOwnProperty(key) : true ? false;

If you want to check if the object has at least one property in es2015

Object.keys(yourObjName).length : true ? false

3



ES6 solution

using Array#some and Object.keys. It will return true if given key exists in the object or false if it doesn't.

var obj = {foo: 'one', bar: 'two'};
    
function isKeyInObject(obj, key) {
    var res = Object.keys(obj).some(v => v == key);
    console.log(res);
}

isKeyInObject(obj, 'foo');
isKeyInObject(obj, 'something');

One-line example.

console.log(Object.keys({foo: 'one', bar: 'two'}).some(v => v == 'foo'));


3



We can use - hasOwnProperty.call(obj, key);

The underscore.js way -

if(_.has(this.options, 'login')){
  //key 'login' exists in this.options 
}

_.has = function(obj, key) {
  return hasOwnProperty.call(obj, key);
};

2