Vraag Controleren of er een sleutel bestaat in een JavaScript-object?


Hoe controleer ik of een bepaalde sleutel bestaat in een JavaScript-object of -array?

Als een sleutel niet bestaat en ik probeer er toegang toe te krijgen, zal deze dan false opleveren? Of een foutmelding geven?


2221
2017-07-08 13:21


oorsprong


antwoorden:


Controleren op ongedefinieerdheid is geen nauwkeurige manier om te testen of een sleutel bestaat. Wat als de sleutel bestaat, maar de waarde is eigenlijk undefined?

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

Gebruik in plaats daarvan de in operator:

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

Als u wilt controleren of een sleutel niet bestaat, vergeet dan niet om haakjes te gebruiken:

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

Of gebruik, als u in het bijzonder wilt testen op eigenschappen van de objectinstantie (en niet over geërfde eigenschappen) hasOwnProperty:

obj.hasOwnProperty("key") // true

Voor prestatievergelijking tussen de methoden die dat wel zijn in, hasOwnProperty en de sleutel is undefined, zie dit criterium


3074
2017-07-08 15:51



snel antwoord

Hoe controleer ik of een bepaalde sleutel bestaat in een JavaScript-object of -array?   Als een sleutel niet bestaat en ik probeer er toegang toe te krijgen, zal deze dan false opleveren? Of een foutmelding geven?

Rechtstreeks toegang krijgen tot een ontbrekende eigenschap met behulp van de (associatieve) arraystijl of objectstijl retourneert een onbepaald constante.

Het trage en betrouwbare in operator en hasOwnProperty methode

Zoals mensen hier al hebben genoemd, kunt u een object hebben met een eigenschap die is gekoppeld aan een "niet-gedefinieerde" constante.

 var bizzareObj = {valid_key:  undefined};

In dat geval zult u moeten gebruiken hasOwnProperty of in om te weten of de sleutel echt aanwezig is. Maar, maar tegen welke prijs?

dus, ik zeg je ...

in operator en hasOwnProperty zijn "methodes" die het mechanisme van de eigendomsdescriptor in Javascript gebruiken (vergelijkbaar met Java-reflectie in de Java-taal).

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

Het eigenschapdescriptortype wordt gebruikt om de manipulatie en reïficatie van benoemde eigenschapseigenschappen uit te leggen. Waarden van het type eigenschap Descriptor zijn records die zijn samengesteld uit benoemde velden waarvan de naam van elk veld een attribuutnaam is en waarvan de waarde een overeenkomstige attribuutwaarde is zoals gespecificeerd in 8.6.1. Bovendien kan elk veld aanwezig of afwezig zijn.

Aan de andere kant, het aanroepen van een objectmethode of sleutel gebruikt het Javascript [[Get]] -mechanisme. Dat is veel veel sneller!

criterium

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

Comparing key access in JS.

Gebruik makend van in operator
var result = "Impression" in array;

Het resultaat was

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

Het resultaat was

16,021,758 ±0.45% ops/sec     91% slower
Rechtstreeks toegang tot elementen (haakstijl)
var result = array["Impression"] === undefined

Het resultaat was

168,270,439 ±0.13 ops/sec     0.02% slower 
Rechtstreeks toegang tot elementen (objectstijl)
var result = array.Impression  === undefined;

Het resultaat was

168,303,172 ±0.20%     fastest

EDIT: Wat is de reden om een ​​eigenschap toe te wijzen aan de undefined waarde?

Die vraag brengt me in de war. In Javascript zijn er ten minste twee verwijzingen voor afwezige objecten om problemen als deze te voorkomen: null en undefined.

null is de primitieve waarde die de opzettelijke afwezigheid van een objectwaarde vertegenwoordigt, of in korte termen, de bevestigd gebrek aan waarde. Aan de andere kant, undefined is onbekende waarde (niet gedefinieerd). Als er een eigenschap is die later met een wordt gebruikt gepast waarde overweeg gebruik null referentie in plaats van undefined omdat op het eerste moment het eigendom is bevestigd om een ​​waarde te missen.

Vergelijken:

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

Adviseren

Vermijd objecten met undefined waarden. Controleer direct waar mogelijk en gebruik null om eigenschapswaarden te initialiseren. Gebruik anders het langzaam in operator of hasOwnProperty() methode.

EDIT: 12/04/2018 - NIET RELEVANT MEER

Zoals mensen hebben opgemerkt, hebben moderne versies van de Javascript-engines (met uitzondering van firefox) de benadering voor toegangseigenschappen gewijzigd. De huidige implementatie is in dit geval langzamer dan de vorige, maar het verschil tussen de toegangssleutel en het object is verwaarloosbaar.


224
2018-02-27 16:38



Het zal terugkeren undefined.

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

undefined is een speciale constante waarde. Dus je kunt zeggen, b.

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

Dit is waarschijnlijk de beste manier om te controleren op ontbrekende toetsen. Zoals echter in een opmerking hieronder wordt aangegeven, is het theoretisch mogelijk dat u de werkelijke waarde wilt hebben undefined. Ik heb dit nooit hoeven doen en kan geen reden waarom ik zou willen bedenken, maar ter wille van de volledigheid, kun je de in operator

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

114
2017-07-08 13:24



De geaccepteerd antwoord verwijst naar Voorwerp. Pas op voor gebruik van de in operator op reeks om gegevens te vinden in plaats van sleutels:

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

Bestaande elementen in een array testen: De beste manier om te vinden of een artikel in een JavaScript-array staat?


22
2017-07-01 12:45



"key" in obj

Test waarschijnlijk alleen objectkenmerkwaarden die erg verschillen van arraysleutels


20
2018-04-25 15:45



Drie manieren om te controleren of een eigenschap aanwezig is in een javascript-object:

  1. !! obj.theProperty
    Converteert waarde naar Bool. geeft WAAR terug voor alle waarden behalve de 'false'
  2. 'theProperty' in obj
    Zal waar terugkeren als de eigenschap bestaat, ongeacht de waarde (zelfs leeg)
  3. obj.hasOwnProperty ( 'theproperty')
    Controleert de prototypeketting niet. (aangezien alle objecten de methode 'toString' hebben, geven 1 en 2 true terug, terwijl 3 false erop kunnen retourneren.)

Referentie:

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


20
2017-11-12 09:19



Als je gebruikt underscore.js bibliotheek dan object / array-bewerkingen worden eenvoudig.

In uw geval _.heeft de methode kunnen worden gebruikt. Voorbeeld:

yourArray = {age: "10"}

_.has(yourArray, "age")

komt terug waar 

Maar,

_.has(yourArray, "invalidKey")

komt terug vals


13
2018-05-29 19:37



Antwoord:

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

Uitleg:

De in operator zal controleren of de sleutel in het object bestaat. Als je hebt gecontroleerd of de waarde ongedefinieerd was: if (myObj["key"] === 'undefined'), u kunt tegen problemen aanlopen omdat er mogelijk een sleutel in uw object met de undefined waarde.

Om die reden is het veel beter om eerst de in operator en vergelijk de waarde die zich in de sleutel bevindt als u al weet dat deze bestaat.


10
2018-06-22 02:29



Hier is een helperfunctie die ik redelijk nuttig vind

Deze keyExists(key, search) kan worden gebruikt om eenvoudig een sleutel op te zoeken binnen objecten of arrays!

Geef het gewoon de sleutel die u wilt vinden en zoek obj (het object of de array) waarin u het wilt vinden.

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

Hoe te gebruiken:

Zoeken naar sleutels in arrays

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

Zoeken naar sleutels in objecten

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

Het is redelijk betrouwbaar geweest en werkt goed in de browser.


9
2018-03-05 12:56



vanila js

yourObjName.hasOwnProperty(key) : true ? false;

Als u wilt controleren of het object ten minste één eigenschap in es2015 heeft

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

4
2018-01-25 15:39