javascript - property - json 객체 찾기




JavaScript 객체에 키가 있는지 확인하고 싶습니다. (13)

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

키가 존재하지 않고 액세스하려고하면 false가 반환됩니까? 아니면 오류가 발생합니까?


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


빠른 대답

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

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

느리고 신뢰할 수 있는 연산자 및 hasOwnProperty 메서드

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

 var bizzareObj = {valid_key:  undefined};

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

그래서, 내가 너에게 말한다.

in 연산자와 hasOwnProperty 는 Javascript에서 Property Descriptor 메커니즘을 사용하는 "메소드"입니다 (Java 언어의 Java 리플렉션과 비슷 함).

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

속성 설명자 형식은 명명 된 속성 특성의 조작 및 구체화를 설명하는 데 사용됩니다. 속성 기술자 유형의 값은 각 필드의 이름이 속성 이름이고 그 값이 8.6.1에 명시된 것과 같은 해당 속성 값인 명명 된 필드로 구성된 레코드입니다. 또한 모든 필드가 있거나 없을 수 있습니다.

반면에 객체 메소드 나 키를 호출하면 Javascript [[Get]] 메커니즘을 사용하게됩니다. 그것은 훨씬 더 빠릅니다!

기준

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

.

연산자 에서 사용
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 값을 할당하는 이유는 무엇입니까?

그 질문은 나를 괴롭힌다. Javascript에는 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, 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[].

권하다

undefined 값을 가진 객체를 피하십시오. 가능할 때마다 직접 확인하고 null 을 사용하여 속성 값을 초기화하십시오. 그렇지 않으면 slow in 연산자 또는 hasOwnProperty() 메소드를 사용하십시오.

편집 : 12/04/2018 - 전혀 관련 없음

사람들이 논평 한대로, 파이어 폭스 예외가있는 자바 엔진의 최신 버전은 액세스 속성에 대한 접근 방식을 변경했습니다. 현재의 구현은이 특별한 경우에 대한 이전 구현보다 느리지 만 액세스 키와 객체 간의 차이는 무시할 수 있습니다.


- hasOwnProperty.call(obj, key); 사용할 수 있습니다 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);
};

그들의 프로젝트에 포함 된 lodash 가있는 사람들을 위해 :
"깊은"키를 얻으려고하는 lodash _.get 메소드가 있습니다 :

object의 패스에있는 값을 가져옵니다. 해결 된 값이 미정 도리의 경우, 그 자리에 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, '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>

이 키가 정의되어 있고 키가 정의되어 있지 않으면 프로그램의 흐름에 해를 줄 수있는 오류가 발생 하지 않는지 여부를 효과적으로 확인합니다.


그것은 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
}

바닐라 주니어

yourObjName.hasOwnProperty(key) : true ? false;

객체에 es2015에서 적어도 하나의 속성이 있는지 확인하려는 경우

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

이것은 오래된 질문이지만 나는 대답을하기 위해 늦은 시간을 가지지 않을 것입니다.

상품 "제품"과 아이템 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

이것은 키가 존재 하는지를 반드시 확인하지만, 값의 진실성을 검사합니다. undefined 않고 null 이되는 항목

Boolean(obj.foo)

이 솔루션은 typescript를 사용 'foo' in obj 또는 obj.hasOwnProperty('foo') 'foo' in obj 와 같은 문자열을 사용하여 키가 있는지 여부를 확인하여 intellisense를 제공하지 않기 때문에 나에게 가장 적합합니다.


정의되지 않은 상태인지 확인하는 것은 키가 있는지 여부를 테스트하는 정확한 방법이 아닙니다. 키가 있지만 값이 실제로 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

, hasOwnProperty 및 key in 있는 메소드의 성능 비교는이 jsben.ch/#/WqlIl 참조하십시오.


확인하는 가장 쉬운 방법은 다음과 같습니다.

"key" in object

예 :

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

true를 반환하는 값은 키가 객체에 있음을 의미합니다.


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의 다른 용도를 확인하십시오.


대답:

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

설명:

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

이런 이유로 먼저 in 연산자를 사용하고 키가있는 것으로 알고 나면 키 내부의 값을 비교하는 것이 훨씬 더 좋습니다.


"key" in obj

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







object