etc./StackOverFlow

JavaScript 객체에 키가 있는지 확인하시겠습니까?

청렴결백한 만능 재주꾼 2021. 10. 7. 22:04
반응형

질문자 :Adam Ernst


JavaScript 객체나 배열에 특정 키가 있는지 어떻게 확인합니까?

키가 존재하지 않고 액세스하려고 하면 false를 반환합니까? 아니면 오류를 던질까요?



정의되지 않음을 확인하는 것은 키가 있는지 여부를 테스트하는 정확한 방법이 아닙니다. 키가 존재하지만 값이 실제로 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 // Do not do this! It is equivalent to "false in obj"

또는 상속된 속성이 아닌 개체 인스턴스의 속성을 특별히 테스트하려면 hasOwnProperty 사용합니다.

 obj.hasOwnProperty("key") // true

, hasOwnProperty 및 key is undefined in 있는 메서드 간의 성능 비교는 이 벤치마크를 참조하세요.


Ates Goral

빠른 답변

JavaScript 객체나 배열에 특정 키가 있는지 어떻게 확인합니까? 키가 존재하지 않고 액세스하려고 하면 false를 반환합니까? 아니면 오류를 던질까요?

(연관) 배열 스타일 또는 객체 스타일을 사용하여 누락된 속성에 직접 액세스하면 정의되지 않은 상수가 반환됩니다.

느린하고 신뢰할 수있는 연산자hasOwnProperty 방법

사람들이 이미 여기에서 언급했듯이 "정의되지 않은" 상수와 연결된 속성을 가진 개체를 가질 수 있습니다.

 var bizzareObj = {valid_key: undefined};

이 경우 키가 실제로 있는지 확인 하려면 hasOwnProperty 또는 in 연산자를 사용해야 합니다. 하지만, 하지만 어떤 가격에?

그래서, 나는 당신에게 말합니다 ...

in 연산자 및 hasOwnProperty 는 Javascript의 속성 설명자 메커니즘을 사용하는 "메소드"입니다(Java 언어의 Java 리플렉션과 유사).

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

속성 설명자 유형은 명명된 속성 속성의 조작 및 구체화를 설명하는 데 사용됩니다. Property Descriptor 유형의 값은 각 필드의 이름이 속성 이름이고 해당 값이 8.6.1에 지정된 해당 속성 값인 명명된 필드로 구성된 레코드입니다. 또한 모든 필드가 존재하거나 없을 수 있습니다.

반면에 개체 메서드 또는 키를 호출하는 경우 Javascript [[Get]] 메커니즘을 사용합니다. 그것은 훨씬 더 빠릅니다!

기준

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

JS의 키 액세스 비교 .

in 연산자 사용
 var result = "Impression" in array;

결과는

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

결과는

 16,021,758 ±0.45% ops/sec 91% slower
요소에 직접 액세스(대괄호 스타일)
 var result = array["Impression"] === undefined

결과는

 168,270,439 ±0.13 ops/sec 0.02% slower
요소에 직접 액세스(객체 스타일)
 var result = array.Impression === undefined;

결과는

 168,303,172 ±0.20% fastest

undefined 값을 할당하는 이유는 무엇입니까?

그 질문은 나를 어리둥절하게 한다. nullundefined 와 같은 문제를 피하기 위해 부재 개체에 대한 참조가 두 개 이상 있습니다.

null 은 객체 값의 의도적인 부재 또는 단기적으로 확인 된 값 부족을 나타내는 기본 값입니다. 반면에 undefined 는 알 수 없는 값(정의되지 않음)입니다. 나중에 적절한 값으로 사용할 속성이 있으면 초기에 속성에 값이 없는 것으로 확인 undefined null 참조를 사용하는 것이 좋습니다.

비교하다:

 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, ie: 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[].

조언

undefined 값을 가진 개체를 피하십시오. 가능하면 직접 확인하고 null 을 사용하여 속성 값을 초기화합니다. 그렇지 않으면 느린 in 연산자 또는 hasOwnProperty() 메서드를 사용하십시오.

편집: 2018년 4월 12일 - 더 이상 관련이 없음

사람들이 언급했듯이 최신 버전의 Javascript 엔진(firefox 제외)은 액세스 속성에 대한 접근 방식을 변경했습니다. 현재 구현은 이 특정 경우에 대해 이전 구현보다 느리지만 액세스 키와 개체 간의 차이는 무시할 수 있습니다.


rdllopes

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 }

Eli Courtwright

"key" in obj

배열 키와 매우 다른 개체 속성 값만 테스트할 가능성이 있습니다.


user2320522

허용되는 답변 은 Object 를 참조합니다. 키 대신 데이터를 찾으려면 배열 in 연산자 를 사용하는 것에 주의하십시오.

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

배열의 기존 요소를 테스트하려면:항목이 JavaScript 배열에 있는지 찾는 가장 좋은 방법은 무엇입니까?


handle

속성이 자바스크립트 객체에 존재하는지 확인하는 세 가지 방법:

  1. !!obj.theProperty
    값을 bool로 변환합니다. false 값을 제외한 모든 값에 대해 true를 반환 true
  2. obj의 ' theProperty
    값에 관계없이 속성이 존재하면 true를 반환합니다(비어 있음).
  3. obj.hasOwnProperty('theProperty')
    프로토타입 체인을 확인하지 않습니다. (모든 객체에는 toString 메서드가 있으므로 1과 2는 true를 반환하고 3은 false를 반환할 수 있습니다.)

참조:

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


Lavi Avigdor

underscore.js 라이브러리를 사용하는 경우 객체/배열 작업이 간단해집니다.

귀하의 경우 _.has 메소드를 사용할 수 있습니다. 예시:

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

true를 반환

하지만,

 _.has(yourArray, "invalidKey")

거짓을 반환


vatsal

답변:

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

설명:

in 연산자는 키가 객체에 존재하는지 확인합니다. 값이 정의되지 않았는지 확인했다면: if (myObj["key"] === 'undefined') undefined 값을 가진 개체에 존재할 수 있기 때문에 문제가 발생할 수 있습니다.

in 연산자를 사용한 다음 키가 존재한다는 것을 알게 되면 키 내부의 값을 비교하는 것이 훨씬 더 나은 방법입니다.


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

그것은 꽤 안정적이었고 크로스 브라우저에서 잘 작동합니다.


jaredwilli

바닐라 js

 yourObjName.hasOwnProperty(key) : true ? false;

es2015에서 개체에 하나 이상의 속성이 있는지 확인하려는 경우

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

Hajji Tarik

ES6 솔루션

Array#someObject.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'));


kind user

선택적 연결 연산자 :

 const invoice = {customer: {address: {city: "foo"}}} console.log( invoice?.customer?.address?.city ) console.log( invoice?.customer?.address?.street ) console.log( invoice?.xyz?.address?.city )

지원되는 브라우저 목록 보기


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, 'abc'), // => undefined _.get(object, 'abc', 'default') // => 'default' )
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>


이렇게 하면 해당 키가 아무리 깊더라도 정의되어 있는지 확인하고 해당 키가 정의되지 않은 경우 프로그램의 흐름에 해를 끼칠 수 있는 오류가 발생하지 않습니다.


vsync

가장 쉽게 확인하는 방법은

 "key" in object

예를 들어:

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

값을 true 로 반환하면 키가 개체에 있음을 의미합니다.


shekhardtu

다음을 사용할 수 있습니다. 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); };

Mohan Dere

객체의 모든 깊이에서 키를 확인하고 잘못된 값을 설명하려면 유틸리티 함수에 대해 다음 행을 고려하십시오.

 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


Alex

키가 있는지 여부를 반드시 확인하는 것은 아니지만 값의 진실성을 확인합니다. undefined null 해당됩니다.

Boolean(obj.foo)

이 솔루션은 내가 typescript를 사용하고 obj 또는 obj.hasOwnProperty('foo') 'foo' in obj 와 같은 문자열을 사용하여 키가 있는지 여부를 확인하는 것이 인텔리센스를 제공하지 않기 때문에 가장 잘 작동합니다.


realappie

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

sarea

'배열' 세계에서 인덱스를 일종의 키로 볼 수 있습니다. 놀라운 것은 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]);


Kamil Kiełczewski

선택적 연결 ( ?. ) 연산자를 사용할 수도 있습니다.

출처: MDN/Operators/Optional_chaining

 const adventurer = { name: 'Alice', cat: { name: 'Dinah' } } console.log(adventurer.dog?.name) // undefined console.log(adventurer.cat?.name) // Dinah


Aditya Rewari

yourArray.indexOf(yourArrayKeyName) > -1

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

진실


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

거짓


Anupam Maurya

ES11이 도입된 이후로 nullish 병합 연산자를 사용할 수 있다는 점은 주목할 가치가 있습니다. 이는 작업을 많이 단순화합니다.

 const obj = {foo: 'one', bar: 'two'}; const result = obj.foo ?? "Not found";

위의 코드는 foo의 "거짓" 값에 대해 "찾을 수 없음"을 반환합니다. 그렇지 않으면 obj.foo를 반환합니다.

nullish 병합 연산자와 결합 참조


Miki

이 예는 다양한 방법 간의 차이점을 보여줄 수 있습니다. 귀하의 필요에 맞는 것을 선택하는 데 도움이 되기를 바랍니다.

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

Alexander

제 경우에는 객체인 LUIS가 반환하는 NLP 메타데이터를 확인하고 싶었습니다. 문자열 "FinancialRiskIntent"인 키가 해당 메타데이터 개체 내부에 키로 존재하는지 확인하고 싶었습니다.

  1. 확인해야 하는 중첩된 개체를 대상으로 지정하려고 했습니다. -> data.meta.prediction.intents
  2. 키가 존재하는지 확인하기 위해 아래 코드를 사용했습니다.

 const hasKey = 'FinancialRiskIntent' in data.meta.prediction.intents; if(hasKey) { console.log('The key exists.'); } else { console.log('The key does not exist.'); }

이것은 내가 처음에 찾고 있던 특정 키를 확인하는 것입니다.

이 비트가 누군가를 돕기를 바랍니다.


Gel

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의 다른 사용을 확인하십시오


NAVIN

빠르고 쉬운 솔루션은 객체를 json으로 변환하는 것입니다. 그러면 다음과 같은 쉬운 작업을 수행할 수 있습니다.

 const allowed = { '/login' : '', '/register': '', '/resetpsw': '' }; console.log('/login' in allowed); //returns true

배열을 사용하면 객체 키는 0,1,2,3 등의 정수로 변환되므로 항상 false입니다.


jerryurenaa

출처 : http:www.stackoverflow.com/questions/1098040/checking-if-a-key-exists-in-a-javascript-object

반응형