it-roy-ru.com

Проверка, существует ли ключ в объекте JavaScript?

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

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

2514
Adam Ernst

Проверка на неопределенность не является точным способом проверки существования ключа. Что если ключ существует, но на самом деле это значение 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, смотрите в этом бенчмарке

3361
Ates Goral

Он вернет 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
}
119
Eli Courtwright

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

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

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

24
handle
"key" in obj

Вероятно, тестируются только значения атрибутов объекта, которые сильно отличаются от ключей массива

20
user2320522

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

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

Ссылка: 

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

20
Lavi Avigdor

Если вы используете underscore.js library, то операции с объектами/массивами становятся простыми. 

В вашем случае можно использовать метод _.has. Пример:

yourArray = {age: "10"}

_.has(yourArray, "age")

возвращает правда  

Но,

_.has(yourArray, "invalidKey")

возвращает ложь

13
vatsal

Ответ:

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

Объяснение:

Оператор in проверит, существует ли ключ в объекте. Если вы проверили, является ли значение неопределенным: if (myObj["key"] === 'undefined'), вы можете столкнуться с проблемами, поскольку в вашем объекте может существовать ключ со значением undefined.

По этой причине гораздо лучше сначала использовать оператор in, а затем сравнить значение, находящееся внутри ключа, когда вы уже знаете, что оно существует.

12
Webeng

Вот вспомогательная функция, которую я нахожу весьма полезной

Эта keyExists(key, search) может использоваться для простого поиска ключа в объектах или массивах! 

Просто передайте ему ключ, который вы хотите найти, и найдите obj (объект или массив), в котором вы хотите его найти.

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

Как это использовать:

Поиск ключей в массивах

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

Поиск ключей в объектах

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

Это было довольно надежно и хорошо работает в разных браузерах.

9
jaredwilli

Решение ES6

используяArray#someиObject.keys. Он вернет true , если данный ключ существует в объекте, или false , если его нет.

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

Пример в одну строку.

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

5
kind user

ваниль JS

yourObjName.hasOwnProperty(key) : true ? false;

Если вы хотите проверить, имеет ли объект хотя бы одно свойство в es2015

Object.keys(yourObjName).length : true ? false
5
Hajji Tarik

Мы можем использовать - hasOwnProperty.call(obj, key);

underscore.js way - 

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

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

Это старый вопрос, но я думаю, никогда не поздно дать ответ.

Представьте, что у вас есть объект «продукты» и два предмета. Если вы хотите увидеть, существует ли id в этом объекте, вы можете использовать find () 

products = [
    {
        "id": 1,
        "name": "Name 1"
    },
    {
        "id": 2,
        "name": "Name 2"
    },
  ]

  item1 = 
    {
        "id": 3,
        "name": "Name 3",
    }



  item2 = 
    {
        "id": 1,
        "name": "Name 1",
    }



  if(products.find(x => x.id === item1.id)){
    console.log('id is in products');
  }else {
    console.log('id is not in products');
  }
  if(products.find(x => x.id === item2.id)){
    console.log('id is in products');
  }else {
    console.log('id is not in products');
  }

журнал:

id is not in products
id is in products
2
Admir

Самый простой способ проверить это 

"key" in object

например: 

var obj = {
  a: 1,
  b: 2,
}
"a" in obj // true
"c" in obj // false

Возвращаемое значение как true подразумевает, что ключ существует в объекте. 

2
shekhardtu

Хотя это обязательно проверяет, существует ли ключ, оно проверяет правильность значения. Какие undefined и null подпадают под.

Boolean(obj.foo)

Это решение работает лучше всего для меня, потому что я использую TypeScript и использую такие строки, как 'foo' in obj или obj.hasOwnProperty('foo') , Чтобы проверить, существует ли ключ или нет, и не дает мне intellisense.

1
Abdel

Для тех, которые lodash включены в их проект:
Существует метод lodash _.get , который пытается получить «глубокие» ключи:

Получает значение по пути объекта. Если разрешенное значение не определено, вместо него возвращается DefaultValue.

var object = { 'a': [{ 'b': { 'c': 3 } }] };

console.log(
  _.get(object, 'a[0].b.c'),           // => 3
  _.get(object, ['a', '0', 'b', 'c']), // => 3
  _.get(object, 'a.b.c'),              // => undefined 
  _.get(object, 'a.b.c', 'default')    // => 'default'
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>


Это эффективно проверит, определен ли этот ключ, однако deep и не будет выдает ошибку, которая может повредить потоку вашей программы, если этот ключ не определен.

1
vsync

Эти примеры могут продемонстрировать различия между разными способами. Надеюсь, это поможет вам выбрать правильный для ваших нужд:

// Lets create object `a` using create function `A`
function A(){};
A.prototype.onProtDef=2;
A.prototype.onProtUndef=undefined;
var a=new A();
a.ownProp = 3;
a.ownPropUndef = undefined;

// Let's try different methods:

a.onProtDef; // 2
a.onProtUndef; // undefined
a.ownProp; // 3
a.ownPropUndef; // undefined
a.whatEver; // undefined
a.valueOf; // ƒ valueOf() { [native code] }

a.hasOwnProperty('onProtDef'); // false
a.hasOwnProperty('onProtUndef'); // false
a.hasOwnProperty('ownProp'); // true
a.hasOwnProperty('ownPropUndef'); // true
a.hasOwnProperty('whatEver'); // false
a.hasOwnProperty('valueOf'); // false

'onProtDef' in a; // true
'onProtUndef' in a; // true
'ownProp' in a; // true
'ownPropUndef' in a; // true
'whatEver' in a; // false
'valueOf' in a; // true (on the prototype chain - Object.valueOf)

Object.keys(a); // ["ownProp", "ownPropUndef"]
1
Alexander

Если вы хотите проверить любой ключ на любой глубине объекта и учесть значения Falsey, рассмотрите эту строку для служебной функции:

var keyExistsOn = (o, k) => k.split(".").reduce((a, c) => a.hasOwnProperty(c) ? a[c] || 1 : false, Object.assign({}, o)) === false ? false : true;

Результаты

var obj = {
    test: "",
    locals: {
        test: "",
        test2: false,
        test3: NaN,
        test4: 0,
        test5: undefined,
        auth: {
            user: "hw"
        }
    }
}

keyExistsOn(obj, "")
> false
keyExistsOn(obj, "locals.test")
> true
keyExistsOn(obj, "locals.test2")
> true
keyExistsOn(obj, "locals.test3")
> true
keyExistsOn(obj, "locals.test4")
> true
keyExistsOn(obj, "locals.test5")
> true
keyExistsOn(obj, "sdsdf")
false
keyExistsOn(obj, "sdsdf.rtsd")
false
keyExistsOn(obj, "sdsdf.234d")
false
keyExistsOn(obj, "2134.sdsdf.234d")
false
keyExistsOn(obj, "locals")
true
keyExistsOn(obj, "locals.")
false
keyExistsOn(obj, "locals.auth")
true
keyExistsOn(obj, "locals.autht")
false
keyExistsOn(obj, "locals.auth.")
false
keyExistsOn(obj, "locals.auth.user")
true
keyExistsOn(obj, "locals.auth.userr")
false
keyExistsOn(obj, "locals.auth.user.")
false
keyExistsOn(obj, "locals.auth.user")
true

Также посмотрите этот пакет NPM: https://www.npmjs.com/package/has-deep-value

0
Alex

yourArray.indexOf (yourArrayKeyName)> -1

fruit = ['Apple', 'grapes', 'banana']

fruit.indexOf('Apple') > -1

Верно


fruit = ['Apple', 'grapes', 'banana']

fruit.indexOf('Apple1') > -1

ложь

0
Anupam Maurya

Новое потрясающее решение с Разрушение JavaScript :

let obj = {
    "key1": "value1",
    "key2": "value2",
    "key3": "value3",
};

let {key1, key2, key3, key4} = obj;

// key1 = "value1"
// key2 = "value2"
// key3 = "value3"
// key4 = undefined

// Can easily use `if` here on key4
if(!key4) { console.log("key not present"); } // Key not present

Do check другое использование JavaScript Destructuring

0
NAVIN