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

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

3231
Adam Ernst 8 Июл 2009 в 17:21

18 ответов

Лучший ответ

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

3985
Ates Goral 10 Окт 2019 в 18:56

Ваниль JS

yourObjName.hasOwnProperty(key) : true ? false;

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

Object.keys(yourObjName).length : true ? false
8
Hajji Tarik 25 Янв 2017 в 15:39

Он вернет 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
}
137
hashed_name 18 Май 2019 в 07:49

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

Этот 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;
    }

// How to use it:
// Searching for keys in Arrays
console.log(keyExists('apple', ['apple', 'banana', 'orange'])); // true
console.log(keyExists('fruit', ['apple', 'banana', 'orange'])); // false

// Searching for keys in Objects
console.log(keyExists('age', {'name': 'Bill', 'age': 29 })); // true
console.log(keyExists('title', {'name': 'Jason', 'age': 29 })); // false

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

11
hashed_name 18 Май 2019 в 10:32

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

"key" in object

Например:

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

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

4
shekhardtu 5 Ноя 2018 в 15:30
"key" in obj

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

26
Amal Murali 29 Окт 2013 в 12:10

Решение 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'));
6
kind user 26 Мар 2017 в 15:45

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

Boolean(obj.foo)

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

3
realappie 11 Дек 2019 в 08:57

Новое потрясающее решение с Разрушением 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

Проверьте другое использование деструктуризации JavaScript

-1
NAVIN 31 Авг 2018 в 18:05

Если вы хотите проверить любой ключ на любой глубине объекта и учесть значения 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- глубокое значение

2
Alex 17 Окт 2018 в 12:58

В мире «массивов» мы можем рассматривать индексы как некие ключи. Что удивительно, оператор in (который является хорошим выбором для объекта) также работает с массивами. Возвращаемое значение для несуществующего ключа: undefined

let arr = ["a","b","c"]; // we have indexes: 0,1,2
delete arr[1];           // set 'empty' at index 1
arr.pop();               // remove last item

console.log(0 in arr,  arr[0]);
console.log(1 in arr,  arr[1]);
console.log(2 in arr,  arr[2]);
1
Kamil Kiełczewski 30 Янв 2020 в 09:27

Для тех, кто 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>

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

3
vsync 29 Мар 2017 в 14:47

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

underscore.js -

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

_.has = function(obj, key) {
  return hasOwnProperty.call(obj, key);
};
5
Mohan Dere 2 Дек 2016 в 15:43
const object1 = {
  a: 'something',
  b: 'something',
  c: 'something'
};

const key = 's';

// Object.keys(object1) will return array of the object keys ['a', 'b', 'c']

Object.keys(object1).indexOf(key) === -1 ? 'the key is not there' : 'yep the key is exist';
2
sarea 26 Авг 2019 в 14:12

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

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

yourArray = {age: "10"}

_.has(yourArray, "age")

Возвращает true

Но,

_.has(yourArray, "invalidKey")

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

14
vatsal 29 Май 2014 в 19:48

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

// 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"]
0
Alexander 21 Фев 2018 в 14:23

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

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

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

29
Community 23 Май 2017 в 11:55

< Сильный > Ответ:

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

< Сильный > Объяснение :

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

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

14
Chris McKee 29 Июн 2016 в 12:46