JavaScript 객체나 배열에 특정 키가 있는지 어떻게 확인합니까?
키가 존재하지 않고 액세스하려고 하면 false를 반환합니까? 아니면 오류를 던질까요?
질문자 :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
있는 메서드 간의 성능 비교는 이 벤치마크를 참조하세요.
JavaScript 객체나 배열에 특정 키가 있는지 어떻게 확인합니까? 키가 존재하지 않고 액세스하려고 하면 false를 반환합니까? 아니면 오류를 던질까요?
(연관) 배열 스타일 또는 객체 스타일을 사용하여 누락된 속성에 직접 액세스하면 정의되지 않은 상수가 반환됩니다.
사람들이 이미 여기에서 언급했듯이 "정의되지 않은" 상수와 연결된 속성을 가진 개체를 가질 수 있습니다.
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
.
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
값을 할당하는 이유는 무엇입니까? 그 질문은 나를 어리둥절하게 한다. null
및 undefined
와 같은 문제를 피하기 위해 부재 개체에 대한 참조가 두 개 이상 있습니다.
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()
메서드를 사용하십시오.
사람들이 언급했듯이 최신 버전의 Javascript 엔진(firefox 제외)은 액세스 속성에 대한 접근 방식을 변경했습니다. 현재 구현은 이 특정 경우에 대해 이전 구현보다 느리지만 액세스 키와 개체 간의 차이는 무시할 수 있습니다.
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 }
"key" in obj
배열 키와 매우 다른 개체 속성 값만 테스트할 가능성이 있습니다.
허용되는 답변 은 Object 를 참조합니다. 키 대신 데이터를 찾으려면 배열 in
연산자 를 사용하는 것에 주의하십시오.
("true" in ["true", "false"]) // -> false (Because the keys of the above Array are actually 0 and 1)
배열의 기존 요소를 테스트하려면:항목이 JavaScript 배열에 있는지 찾는 가장 좋은 방법은 무엇입니까?
속성이 자바스크립트 객체에 존재하는지 확인하는 세 가지 방법:
!!obj.theProperty
false
값을 제외한 모든 값에 대해 true를 반환 true
theProperty
obj.hasOwnProperty('theProperty')
toString
메서드가 있으므로 1과 2는 true를 반환하고 3은 false를 반환할 수 있습니다.)참조:
underscore.js 라이브러리를 사용하는 경우 객체/배열 작업이 간단해집니다.
귀하의 경우 _.has 메소드를 사용할 수 있습니다. 예시:
yourArray = {age: "10"} _.has(yourArray, "age")
true를 반환
하지만,
_.has(yourArray, "invalidKey")
거짓을 반환
답변:
if ("key" in myObj) { console.log("key exists!"); } else { console.log("key doesn't exist!"); }
설명:
in
연산자는 키가 객체에 존재하는지 확인합니다. 값이 정의되지 않았는지 확인했다면: if (myObj["key"] === 'undefined')
undefined
값을 가진 개체에 존재할 수 있기 때문에 문제가 발생할 수 있습니다.
in
연산자를 사용한 다음 키가 존재한다는 것을 알게 되면 키 내부의 값을 비교하는 것이 훨씬 더 나은 방법입니다.
이 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
그것은 꽤 안정적이었고 크로스 브라우저에서 잘 작동합니다.
바닐라 js
yourObjName.hasOwnProperty(key) : true ? false;
es2015에서 개체에 하나 이상의 속성이 있는지 확인하려는 경우
Object.keys(yourObjName).length : true ? false
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'));
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
포함된 경우:개체의 경로에서 값을 가져옵니다. 확인된 값이 정의되지 않은 경우 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>
이렇게 하면 해당 키가 아무리 깊더라도 정의되어 있는지 확인하고 해당 키가 정의되지 않은 경우 프로그램의 흐름에 해를 끼칠 수 있는 오류가 발생하지 않습니다.
가장 쉽게 확인하는 방법은
"key" in object
예를 들어:
var obj = { a: 1, b: 2, } "a" in obj // true "c" in obj // false
값을 true 로 반환하면 키가 개체에 있음을 의미합니다.
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); };
객체의 모든 깊이에서 키를 확인하고 잘못된 값을 설명하려면 유틸리티 함수에 대해 다음 행을 고려하십시오.
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
키가 있는지 여부를 반드시 확인하는 것은 아니지만 값의 진실성을 확인합니다. undefined
null
해당됩니다.
Boolean(obj.foo)
이 솔루션은 내가 typescript를 사용하고 obj 또는 obj.hasOwnProperty('foo')
'foo' in obj
와 같은 문자열을 사용하여 키가 있는지 여부를 확인하는 것이 인텔리센스를 제공하지 않기 때문에 가장 잘 작동합니다.
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';
'배열' 세계에서 인덱스를 일종의 키로 볼 수 있습니다. 놀라운 것은 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]);
선택적 연결 ( ?.
) 연산자를 사용할 수도 있습니다.
출처: MDN/Operators/Optional_chaining
const adventurer = { name: 'Alice', cat: { name: 'Dinah' } } console.log(adventurer.dog?.name) // undefined console.log(adventurer.cat?.name) // Dinah
yourArray.indexOf(yourArrayKeyName) > -1
fruit = ['apple', 'grapes', 'banana'] fruit.indexOf('apple') > -1
진실
fruit = ['apple', 'grapes', 'banana'] fruit.indexOf('apple1') > -1
거짓
ES11이 도입된 이후로 nullish 병합 연산자를 사용할 수 있다는 점은 주목할 가치가 있습니다. 이는 작업을 많이 단순화합니다.
const obj = {foo: 'one', bar: 'two'}; const result = obj.foo ?? "Not found";
위의 코드는 foo의 "거짓" 값에 대해 "찾을 수 없음"을 반환합니다. 그렇지 않으면 obj.foo를 반환합니다.
이 예는 다양한 방법 간의 차이점을 보여줄 수 있습니다. 귀하의 필요에 맞는 것을 선택하는 데 도움이 되기를 바랍니다.
// 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"]
제 경우에는 객체인 LUIS가 반환하는 NLP 메타데이터를 확인하고 싶었습니다. 문자열 "FinancialRiskIntent"인 키가 해당 메타데이터 개체 내부에 키로 존재하는지 확인하고 싶었습니다.
data.meta.prediction.intents
const hasKey = 'FinancialRiskIntent' in data.meta.prediction.intents; if(hasKey) { console.log('The key exists.'); } else { console.log('The key does not exist.'); }
이것은 내가 처음에 찾고 있던 특정 키를 확인하는 것입니다.
이 비트가 누군가를 돕기를 바랍니다.
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
빠르고 쉬운 솔루션은 객체를 json으로 변환하는 것입니다. 그러면 다음과 같은 쉬운 작업을 수행할 수 있습니다.
const allowed = { '/login' : '', '/register': '', '/resetpsw': '' }; console.log('/login' in allowed); //returns true
배열을 사용하면 객체 키는 0,1,2,3 등의 정수로 변환되므로 항상 false입니다.
출처 : http:www.stackoverflow.com/questions/1098040/checking-if-a-key-exists-in-a-javascript-object
Java Map의 각 항목을 효율적으로 반복하려면 어떻게 해야 합니까? (0) | 2021.10.07 |
---|---|
JavaScript 객체를 올바르게 복제하려면 어떻게 해야 합니까? (0) | 2021.10.07 |
기존 Git 분기가 원격 분기를 추적하도록 하시겠습니까? (0) | 2021.10.07 |
Git의 브랜치에서 커밋 삭제 (0) | 2021.10.07 |
Git으로 변경된 여러 파일 중 하나의 파일만 보관하시겠습니까? (0) | 2021.10.07 |