Patikrinkite, ar „JavaScript“ objekte yra raktas?

Kaip patikrinti, ar tam tikras raktas yra „JavaScript“ objekte ar masyve?

Jei raktas neegzistuoja, ir bandau jį pasiekti, ar jis sugrįš klaidingai? Arba klaidą?

2418
08 июля '09 в 16:21 2009-07-08 16:21 Adam Ernst yra nustatytas liepos 08'09, 16:21 2009-07-08 16:21
@ 20 atsakymų

Neapibrėžties tikrinimas nėra tikslus būdas patikrinti raktų buvimą. Ką daryti, jei raktas egzistuoja, bet vertė iš tikrųjų yra undefined ?

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

Vietoj to turėtumėte naudoti operatorių:

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

Jei norite patikrinti, ar yra raktas, nepamirškite naudoti skliausteliuose:

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

Arba, jei norite ypač patikrinti objekto egzemplioriaus savybes (o ne paveldėtas savybes), naudokite hasOwnProperty :

 obj.hasOwnProperty("key") // true 

Veiklos palyginimui tarp naudojamų metodų hasOwnProperty ir raktas nėra undefined , žr.

3343
08 июля '09 в 18:51 2009-07-08 18:51 atsakymą pateikė „ Ates Goral“ liepos 08 d., 08: 18: 51 2009-07-08 18:51

greitai reaguoti

Kaip patikrinti, ar objekte ar „JavaScript“ rinkinyje yra konkretus raktas? Jei raktas neegzistuoja, ir bandau jį pasiekti, ar jis sugrįš klaidingai? Arba klaidą?

Pasiekti trūkstamą turtą tiesiogiai naudojant (asociatyvų) masyvo stilių arba objekto stilių grąžina neapibrėžtą konstantą.

Lėtas ir patikimas operatoriaus metodas ir hasOwnProperty

Kaip minėta čia, galite turėti objektą, turintį nuosavybę, susijusią su konstanta „undefined“.

  var bizzareObj = {valid_key: undefined}; 

Tokiu atveju jums reikės naudoti hasOwnProperty arba operatorių, kad sužinotumėte, ar raktas tikrai yra. Bet, bet kokia kaina?

taigi pasakysiu ...

operatoriuje ir hasOwnProperty yra „metodai“, kurie naudoja „JavaScript“ nuosavybės deskriptoriaus mechanizmą (panašų į „Java“ Java).

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

Turto deskriptoriaus tipas naudojamas paaiškinti manipuliacijas ir iš naujo apibrėžti pavadinto turto atributus. Nuosavybės deskriptoriaus tipo vertės yra įrašai, susidedantys iš pavadintų laukų, kuriuose kiekvienas lauko pavadinimas yra atributo pavadinimas ir jo vertė yra atitinkama atributo reikšmė, kaip nurodyta 8.6.1. Be to, gali būti bet koks laukas arba jo nėra.

Kita vertus, objekto ar rakto metodo skambinimas bus naudojamas „JavaScript“ [[Get]] mechanizmu. Tai daug greičiau!

bandymas

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

2019

240
27 февр. atsakymą pateikė rdllopes 27 vasario mėn 2014-02-27 19:38 '14, 19:38, 2014-02-27 19:38

Jis grįš undefined .

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

undefined yra speciali pastovi vertė. Taigi galite pasakyti, pavyzdžiui,

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

Tai tikriausiai yra geriausias būdas patikrinti trūkstamus raktus. Tačiau, kaip nurodyta toliau pateiktame komentare, teoriškai įmanoma, kad faktinė vertė būtų undefined . Aš niekada neturėjau tai padaryti, ir aš negaliu galvoti apie priežastį, kodėl aš kada nors norėjau, bet tik dėl išsamumo jūs galite naudoti „ in operator“

 // this works even if you have {"goodbye": undefined} if( "goodbye" in aa ) { // do something } 
118
08 июля '09 в 16:24 2009-07-08 16:24 atsakymą pateikė Eli Courtwright liepos 08 d. 09:16:24 2009-07-08 16:24

Priimtas atsakymas reiškia objektą . Saugokitės, kad masyvo masyvo operatorius ieškotų duomenų vietoj raktų:

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

Patikrinkite esamas masyvo dalis: geriausias būdas rasti elementą „JavaScript“ masyve?

24
01 июля '15 в 15:45 2015-07-01 15:45 atsakymas pateikiamas rankena liepos 1 d., 15 val. 15:45 2015-07-01 15:45
 "key" in obj 

Tikriausiai tikrinami tik objekto atributų, kurie labai skiriasi nuo masyvo raktų, vertės.

20
25 апр. atsakymą pateikė vartotojo2320522 25 balandis. 2013-04-25 18:45 '13, 18:45 pm 2013-04-25 18:45

Trys būdai patikrinti, ar „JavaScript“ objekte yra turto:

  • !! obj.theProperty
    Konvertuoja vertę į bool. grąžina TRUE visiems, bet vertė „false“
  • „theProperty“ obj
    Grąžinamas tikras, jei turtas yra, nepriklausomai nuo jo vertės (netgi tuščias)
  • obj.hasOwnProperty („theProperty“)
    Netikrina prototipo grandinės. (kadangi visi objektai turi „toString“ metodą, 1 ir 2 grįžta tiesa, o 3 gali grįžti į klaidą).

Nuoroda:

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

20
12 нояб. Atsakymą pateikė Lavi Avigdor lapkričio 12 d 2013-11-12 12:19 '13, 12:19, 2013-11-12 12:19

Jei naudojate „ underscore.js“ biblioteką, operacijos su objektu / masyvu tampa paprastos.

Jūsų atveju gali būti naudojamas _.has metodas. Pavyzdys:

 yourArray = {age: "10"} _.has(yourArray, "age") 

grįžta tiesa

Bet

 _.has(yourArray, "invalidKey") 

grąžina klaidingą

13
29 мая '14 в 22:37 2014-05-29 22:37 atsakymas pateikiamas vasario 29 d., 14 d., 22:37, 2014-05-29 22:37

Atsakymas:

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

Paaiškinimas:

Įjungtas operatorius tikrina, ar objekte yra raktas. Jei pažymėjote, kad reikšmė yra neapibrėžta: if (myObj["key"] === 'undefined') , galite susidurti su problemomis, nes gali būti raktas su undefined jūsų objektu.

Dėl šios priežasties gerokai geriau naudoti pirmiausia operatorių, o tada lyginti raktą viduje, kai tik jau žinote, kad jis egzistuoja.

12
22 июня '16 в 5:29 2016-06-22 05:29 atsakymą Webeng pateikė birželio 22 d. 16 d. 5:29 2016-06-22 05:29

Čia yra pagalbinė funkcija, kurią manau labai naudinga.

Šiuos keyExists(key, search) galima naudoti norint lengvai ieškoti raktų viduje objektų ar masyvų!

Tiesiog suteikite jam raktą, kurį norite rasti ir ieškoti obj (objekto ar masyvo), kurį norite rasti.

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

Kaip jį naudoti:

Paieškos raktai masyvuose

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

Ieškokite raktų objektuose

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

Tai buvo gana patikima ir gerai veikia tarpvalstybinėje naršyklėje.

9
05 марта '16 в 15:56 2016-03-05 15:56 Atsakymą pateikė jaredwilli kovo 05 '16, 15:56 2016-03-05 15:56

ES6 sprendimas

naudojant Array#some ir Object.keys . Ji grąžinama tiesa, jei duotas raktas egzistuoja objekte, arba klaidingas, jei jis neegzistuoja.

 console.log(Object.keys({foo: 'one', bar: 'two'}).some(v => v == 'foo')); 
5
26 марта '17 в 18:45 2017-03-26 18:45 atsakymas suteikiamas natūra, kovo 26 d., 17 val. 18:45 2017-03-26 18:45

vanila js

 yourObjName.hasOwnProperty(key) : true ? false; 

Jei norite patikrinti, ar objektas turi bent vieną turtą es2015

 Object.keys(yourObjName).length : true ? false 
5
25 янв. Atsakymą pateikė Hajji Tarik 25 sausis 2017-01-25 18:39 '17 at 6:39 2017-01-25 18:39

Galime naudoti - 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); }; 
3
02 дек. Atsakymas, kurį pateikė Mohan Dere 02 Dec 2016-12-02 18:38 '16 at 18:38 2016-12-02 18:38

Tai yra senas klausimas, bet manau, kad atsakyti niekada nebus per vėlu.

Įsivaizduokite, kad turite objektą „prekės“ ir du elementus. Jei norite pamatyti, ar šiame objekte jau yra identifikatorius, galite naudoti „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'); } 

Leidinys:

 id is not in products id is in products 
2
26 окт. atsakymas duotas Admir 26 okt. 2017-10-26 16:31 '17, 16:31 pm 2017-10-26 16:31

Paprasčiausias būdas tai patikrinti

 "key" in object 

pavyzdžiui:

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

Vertės grąžinimas kaip tiesa reiškia, kad raktas egzistuoja objekte.

2
05 нояб. atsakymas duotas shekhardtu 05.11 . 2018-11-05 18:30 18 val . 18.30 val. 18.30 val

Nors jis būtinai tikrina, ar yra raktas, jis tikrina vertės patikimumą. Kuris undefined ir null .

Boolean(obj.foo)

Šis sprendimas geriausiai tinka man, nes aš naudoju rašymo ir naudoti eilutes, tokias kaip 'foo' in obj ar obj.hasOwnProperty('foo') kad patikrintumėte, ar raktas egzistuoja, ar ne, suteikia man intellisense.

1
03 янв. atsakymą pateikė Abdel 03 jan. 2018-01-03 19:05 '18, 19:05, 2018-01-03 19:05

Tiems, kurie yra lodash į savo projektą:
Yra nakvynės namai . gauti metodą, kuris bando gauti gilius raktus:

Grąžina objekto kelio vertę. Jei leistina vertė yra neapibrėžta, defaultValue grįžta į savo vietą.

 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script> 

Jis veiksmingai patikrins, ar šis raktas yra įdiegtas, nors ir gilus , ir nesukels klaidos, galinčios pakenkti jūsų programos srautui, jei šis raktas nėra apibrėžtas.

1
29 марта '17 в 17:47 2017-03-29 17:47 atsakymą pateikė vsync kovo 17 d. 17 val. 17:47 2017-03-29 17:47

Šis pavyzdys gali parodyti skirtingų būdų skirtumus. Tikiuosi, kad tai padės jums pasirinkti tinkamą parinktį jūsų poreikiams:

 // 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 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
21 февр. atsakymas pateikiamas Aleksandro 21 vasario mėn. 2018-02-21 17:23 '18, 18:23 PM 2018-02-21 17:23

yourArray.indexOf (yourArrayKeyName)> -1

 fruit = ['apple', 'grapes', 'banana'] fruit.indexOf('apple') > -1 

tiesą


 fruit = ['apple', 'grapes', 'banana'] fruit.indexOf('apple1') > -1 

klaidinga

0
19 февр. atsakymą pateikė Anupam Maurya vasario 19 d. 2019-02-19 13:59 '19, 13:59 pm 2019-02-19 13:59

Jei norite patikrinti bet kurį raktą bet kuriame objekto gylyje ir atsižvelgti į Falsey reikšmes, apsvarstykite šią eilutę paslaugų funkcijai:

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

Rezultatai

 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 

Taip pat patikrinkite šį NPM paketą: https://www.npmjs.com/package/has-deep-value

0
07 сент. atsakymas pateikiamas Alex 07 sep. 2018-09-07 13:04 '18, 1:04 val. 2018-09-07 13:04

Naujas nuostabus sprendimas su „ JavaScript“ struktūra :

 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 

Patikrinkite kitus „JavaScript“ struktūros struktūros panaudojimo būdus

0
31 авг. atsakymas pateikiamas NAVIN 31 d. 2018-08-31 21:05 „18, 21:05 2018-08-31 21:05

Kiti klausimai apie „ žymų arba Užduoti klausimą