Вопрос по arrays, object, javascript – Проверка, существует ли ключ в объекте JavaScript?

2446

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

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

Все (почти все) в JavaScript является объектом или может быть приведено как единое целое. Именно здесь рождаются псевдоассоциативные массивы, как указывал @PatrickM. Andrew Larsson
быстрый обходной путь, обычно я иду наproperty.key = property.key || 'some default value'на всякий случай, я хочу, чтобы этот ключ существовал с некоторым значением для него RGLSV
этот ориентирjsben.ch/#/WqlIl дает вам обзор наиболее распространенных способов достижения этой проверки. EscapeNetscape

Ваш Ответ

20   ответов
9
Here's a helper function I find quite useful

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

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

Это кажется немного запутанным: во-первых, при поиске массива этот метод проверяет наличиеvalueне ключ. Во-вторых, зачем перебирать массив, как этот, когда вы можете использовать встроенныйArray.indexOf метод? (если вы ищете значение, то есть)
0

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

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 Destructuring

5

Ванила JS

yourObjName.hasOwnProperty(key) : true ? false;

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

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

!!obj.theProperty
Will convert value to bool. returns TRUE for all but the 'false' value 'theProperty' in obj
Will return true if the property exists, no matter its value (even empty) obj.hasOwnProperty('theProperty')
Does not check the prototype chain. (since all objects have the 'toString' method, 1 and 2 will return true on it, while 3 can return false on it.)

Ссылка:

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

1

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

Boolean(obj.foo)

Это решение работает лучше всего для меня, потому что я использую машинопись, и использую строки, как'foo' in obj или жеobj.hasOwnProperty('foo') to check whether a key exists or not does not provide me with intellisense.

13

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

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

yourArray = {age: "10"}

_.has(yourArray, "age")

возвращаетсяtrue

Но,

_.has(yourArray, "invalidKey")

возвращаетсяfalse

3

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

"key" in object

например:

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

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

12

Answer:

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

Explanation:

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

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

3386

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

Я убежден, что существуют варианты использования для преднамеренного задания свойств неопределенными.
Аналогичная проблема существует в PHP, где null == не существует:stackoverflow.com/q/418066/372654 и, к сожалению, там тоже есть ноль.
Допустимый вариант использования: Gecko 1.9.1 [Firefox 3.5] не имеет свойства window.onhashchange. Gecko 1.9.2 [Firefox 3.6] имеет это свойство равным undefined (до тех пор, пока хэш не изменится). Чтобы функция обнаружила историю хэшей или версию браузера, необходимо использовать window.hasOwnProperty (& quot; onhashchange & quot;);
Наличие свойства с заданным вручную значением undefined не имеет абсолютно никакого смысла. Это был бы оксюморон на самом деле.
@joebert То, что что-то является чепухой, не означает, что вы не столкнетесь с этим в рабочем коде. Есть много библиотек, которые делают бессмысленные вещи.
24

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

// -> false (Because the keys of the above Array are actually 0 and 1)

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

1

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

// 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"]
120

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
}
Что если ключ существует, но значение на самом деле не определено?
Вы должны использовать === вместо == при сравнении с undefined, иначе null будет сравниваться как undefined.
@ssiceundefined не является записываемым свойством согласно спецификацииecma-international.org/ecma-262/5.1/#sec-15.1.1.3
В более ранних версиях JavaScript "неопределенный" и "NaN"; были изменяемые переменные, которыеcould be redefined or assigned other values, Это было плохо. Это было исправлено в ECMAScript 5.
Или ваш ответ не совсем точен. Потому что в любом случае (и, конечно, это никогда не должно быть сделано) undefined не является специальным постоянным значением. Фактически, это не зарезервированное ключевое слово, и вы можете перезаписать его, скажем, например, чтоvar undefined = 42;, При тестировании неопределенного реквизита вы всегда должны использовать((typeof variable) === "undefined").
1
For those which have lodash included in their project:
There is a lodash _.get method which tries to get "deep" keys:

the defaultValue is returned in its place.

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, определяется иwill not выдает ошибку, которая может повредить поток вашей программы, если этот ключ не определен.

5
ES6 solution

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

@ Сид Дай мне пример.
Простите, но вы проверили вывод второго оператора консоли? Object.defineProperty эквивалентно установке свойства с использованием точечной нотации.
@Sid Знаешь ли ты, что твой пример не связан с вопросом? Совсем?
Это не удастся для неисчислимых свойств объекта.
Ну вот. let joshua = {имя: «Иисус Навин», адрес: «Лондон»; }; Object.defineProperty (joshua, «isMarried», {value: true, enumerable: false}); console.log («isMarried» в Object.keys (joshua))
0

значения Falsey, рассмотрите эту строку для служебной функции:

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

Results

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

2

Представьте, что у вас есть объект «продукты» и два предмета. Если вы хотите увидеть, существует ли 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
3
We can use - hasOwnProperty.call(obj, key);

underscore.js путь -

  //key 'login' exists in this.options 
}

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

ray? If a key doesn't exist and I try to access it, will it return false? Or throw an error?

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

The slow and reliable in operator and hasOwnProperty method

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

 var bizzareObj = {valid_key:  undefined};

В этом случае вам придется использоватьhasOwnProperty или жеin Оператор, чтобы узнать, действительно ли ключ там. Но,but at what price?

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

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

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

The Property Descriptor type is used to explain the manipulation and reification of named property attributes. Values of the Property Descriptor type are records composed of named fields where each field’s name is an attribute name and its value is a corresponding attribute value as specified in 8.6.1. In addition, any field may be present or absent.

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

benchmark

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

Comparing key access in JS.

Using in operator
var result = "Impression" in array;

Результат был

12,931,832 ±0.21% ops/sec      92% slower 
Using hasOwnProperty
var result = array.hasOwnProperty("Impression")

Результат был

16,021,758 ±0.45% ops/sec     91% slower
Accessing elements directly (brackets style)
var result = array["Impression"] === undefined

Результат был

168,270,439 ±0.13 ops/sec     0.02% slower 
Accessing elements directly (object style)
var result = array.Impression  === undefined;

Результат был

168,303,172 ±0.20%     fastest
EDIT: What is the reason to assign to a property the undefined value?

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

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

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

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[].
Advise

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

EDIT: 12/04/2018 - NOT RELEVANT ANYMORE

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

As @ H & # xFC; seyinYa & # x11F; l & # x131; упоминается, если вы проверитеjsperf Ссылка, производительность значительно изменилась между различными методами для большинства браузеров, так как этот ответ был изначально написан. Firefox - один из немногих, у которого все еще есть значительное преимущество, используя методы массива или объекта, но для многих других браузеров различия незначительны.
+1 для бенчмаркинга. Спасибо, это именно та информация, которую я надеялся найти. Определенно сильный аргумент для написания кода, который никогда не назначает или ожидает, что ключ будет содержать значениеundefined.
Мне было любопытно, как сравнивается Underscore.js (), поэтому я добавил его в jsperf (version 11). Оказывается, он находится в медленной группе вместе с in и hasOwnProperty ().
Являются ли все эти методы приемлемыми во всех широко используемых браузерах, например, IE8 +?
Одна из причин, по которой я бы присвоил неопределенному значению хеш-значение, заключается в том, что я действительно хотел удалить этот ключ свойства из хеш-функции, ноdelete hash[key] являетсяmuch slower than hash[key] = undefined, Конечно, в этом случае для меня нет смыслаin оператор, но он действует как контрпример к & # x201C; мы всегда должны избегать установки значения в undefined & # x201D ;.
0

yourArray.indexOf(yourArrayKeyName) > -1


fruit.indexOf('apple') > -1

true



fruit.indexOf('apple1') > -1

false

20
"key" in obj

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

Этот код даст значение true также для ключа, который определен в прототипе Class: function A () {}; A.prototype.b = 2; var a = new A (); Тогда «b» в это правда. Хотя a.hasOwnProperty («b»), конечно, ложно.

Похожие вопросы