JavaScript를 사용하여 객체에 값이 있는지 확인하는 방법


103

JavaScript에 개체가 있습니다.

var obj = {
   "a": "test1",
   "b": "test2"
}

test1이 객체에 값으로 존재하는지 어떻게 확인합니까?


16
와우 .. 중복으로 표시 한 사람들은 미쳤거나 영어를 읽는 방법을 모릅니다. 어쨌든, ES7, 당신은 뭔가를 할 :Object.values(obj).includes('test1');
— 말리 Naeemi

2
다음은 중복되지 않음 (키 확인)입니다. stackoverflow.com/questions/1098040/…
— Samuel Åslund

답변:


126

Object의 값을 배열로 바꾸고 문자열이 있는지 테스트 할 수 있습니다. Object가 중첩되지 않고 문자열이 정확히 일치한다고 가정합니다.

var obj = { a: 'test1', b: 'test2' };
if (Object.values(obj).indexOf('test1') > -1) {
   console.log('has test1');
}

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/values


8
이것은, 그것은 :( 아직 대부분의 용도에 사용할 수없는 Ecma2017의 일부입니다
— 란 Halprin

2
IE 11 및 Edge에서는 지원되지 않습니다. 아래에 설명 된대로 for..in 루프를 사용하는 것이 더 좋습니다
— eugenesqr

24
약간 덜 if(Object.values(obj).includes('test1')) { ... }
— 장황함

41

Array 메서드를 사용할 수 있습니다 .some.

var exists = Object.keys(obj).some(function(k) {
    return obj[k] === "test1";
});

36

시험:

var obj = {
   "a": "test1",
   "b": "test2"
};

Object.keys(obj).forEach(function(key) {
  if (obj[key] == 'test1') {
    alert('exists');
  }
});

또는

var obj = {
   "a": "test1",
   "b": "test2"
};

var found = Object.keys(obj).filter(function(key) {
  return obj[key] === 'test1';
});

if (found.length) {
   alert('exists');
}

이 작동하지 않습니다 NaN및 -0그 값. ===ECMAScript 6의 새로운 기능 (대신 )을 사용할 수 있습니다 .

 Object.is(obj[key], value);

최신 브라우저에서는 다음을 사용할 수도 있습니다.

var obj = {
   "a": "test1",
   "b": "test2"
};

if (Object.values(obj).includes('test1')) {
  alert('exists');
}


24

for...in루프 사용 :

for (let k in obj) {
    if (obj[k] === "test1") {
        return true;
    }
}

@Gregor는 다음 값을 취할 때 'k'가 다시 정의되므로 중요하지 않습니다.
— Vikrant

4
매우 과소 평가 대답이 하나의 다른 방법보다 더 나은의 성능
— PirateApp

2
그것에 동의합니다. 매우 과소 평가 된 답변 ...
— Samakaab

22

가장 짧은 ES6 + 1 개 라이너 :

let exists = Object.values(obj).includes("test1");

1
IE는 .includes ()를 지원하지 않으므로 Node와 함께 서버 측만 사용하거나 IE에 관심이없는 경우에만 사용하십시오.
— 주앙 피 멘텔 페레이라

19

Object.values ​​() 사용할 수 있습니다 .

이 Object.values()메서드는 for...in루프에서 제공하는 것과 동일한 순서로 주어진 객체의 고유 한 열거 가능한 속성 값의 배열을 반환합니다 (차이점은 for-in 루프가 프로토 타입 체인의 속성도 열거한다는 것입니다).

그런 다음 indexOf () 메서드 를 사용합니다 .

이 indexOf()메서드는 배열에서 주어진 요소를 찾을 수있는 첫 번째 인덱스를 반환하거나없는 경우 -1을 반환합니다.

예를 들면 :

Object.values(obj).indexOf("test`") >= 0

더 자세한 예는 다음과 같습니다.

var obj = {
  "a": "test1",
  "b": "test2"
}


console.log(Object.values(obj).indexOf("test1")); // 0
console.log(Object.values(obj).indexOf("test2")); // 1

console.log(Object.values(obj).indexOf("test1") >= 0); // true
console.log(Object.values(obj).indexOf("test2") >= 0); // true 

console.log(Object.values(obj).indexOf("test10")); // -1
console.log(Object.values(obj).indexOf("test10") >= 0); // false


8

이 모든 예제로 테스트를했고 Node.js v8.11.2 에서 실행했습니다 . 이것을 가이드로 삼아 최선의 선택을 선택하십시오.

let i, tt;
    const obj = { a: 'test1', b: 'test2', c: 'test3', d: 'test4', e: 'test5', f: 'test6' };

console.time("test1")
i = 0;
for( ; i<1000000; i=i+1) {
  if (Object.values(obj).indexOf('test4') > -1) {
    tt = true;
  }
}
console.timeEnd("test1")

console.time("test1.1")
i = 0;
for( ; i<1000000 ; i=i+1) {
  if (~Object.values(obj).indexOf('test4')) {
    tt = true;
  }
}
console.timeEnd("test1.1")

console.time("test2")
i = 0;
for( ; i<1000000; i=i+1) {
  if (Object.values(obj).includes('test4')) {
    tt = true;
  }
}
console.timeEnd("test2")


console.time("test3")
i = 0;
for( ; i<1000000 ; i=i+1) {
  for(const item in obj) {
    if(obj[item] == 'test4') {
      tt = true;
      break;
    }
  }
}
console.timeEnd("test3")

console.time("test3.1")
i = 0;
for( ; i<1000000; i=i+1) {
  for(const [item, value] in obj) {
    if(value == 'test4') {
      tt = true;
      break;
    }
  }
}
console.timeEnd("test3.1")


console.time("test4")
i = 0;
for( ; i<1000000; i=i+1) {
  tt = Object.values(obj).some((val, val2) => {
    return val == "test4"
  });
}
console.timeEnd("test4")

console.time("test5")
i = 0;
for( ; i<1000000; i=i+1) {
  const arr = Object.keys(obj);
  const len = arr.length;
  let i2 = 0;
  for( ; i2<len ; i2=i2+1) {
    if(obj[arr[i2]] == "test4") {
      tt = true;
      break;
    }
  }
}
console.timeEnd("test5")

내 서버에 출력

test1:   272.325 ms
test1.1: 246.316 ms
test2:   251.98 0ms
test3:    73.284 ms
test3.1: 102.029 ms
test4:   339.299 ms
test5:    85.527 ms

6

한 줄짜리의 경우 다음과 같이 말할 것입니다.

exist = Object.values(obj).includes("test1");
console.log(exist);

2

이것을 시도 할 수 있습니다.

function checkIfExistingValue(obj, key, value) {
    return obj.hasOwnProperty(key) && obj[key] === value;
}
var test = [{name : "jack", sex: F}, {name: "joe", sex: M}]
console.log(test.some(function(person) { return checkIfExistingValue(person, "name", "jack"); }));

0

당신은 이것을 시도 할 수 있습니다

var obj = {
  "a": "test1",
  "b": "test2"
};

const findSpecificStr = (obj, str) => {
  return Object.values(obj).includes(str);
}

findSpecificStr(obj, 'test1');

-1
getValue = function (object, key) {
    return key.split(".").reduce(function (obj, val) {
        return (typeof obj == "undefined" || obj === null || obj === "") ? obj : (_.isString(obj[val]) ? obj[val].trim() : obj[val]);}, object);
};

var obj = {
   "a": "test1",
   "b": "test2"
};

호출 된 함수 :

 getValue(obj, "a");

이 솔루션을 구현할 때 다른 라이브러리를 사용 했습니까?
— Sherwin Ablaña Dapito

-2
var obj = {"a": "test1", "b": "test2"};
var getValuesOfObject = Object.values(obj)
for(index = 0; index < getValuesOfObject.length; index++){
    return Boolean(getValuesOfObject[index] === "test1")
}

Object.values ​​() 메서드는 주어진 객체 (obj)의 고유 한 열거 가능한 속성 값을 포함하는 배열 (getValuesOfObject에 할당 됨)을 반환했습니다. 배열은 for루프를 사용하여 반복되어 각 값 (getValuesfromObject의 값)을 검색하고 Boolean () 함수를 반환하여 표현식 ( "text1"이 반복 배열의 값임)이 참인지 확인합니다.



-4

이에 대한 간단한 대답은 아래와 같습니다.

이것은 모든 자바 스크립트 유형이 프로토 타입 에 "생성자" 속성을 가지고 있기 때문에 작동 합니다.

여기에 이미지 설명 입력

여기에 이미지 설명 입력



이미지의 코드를 텍스트로 변환하세요. 미리 감사드립니다.
— Peter Mortensen

-7

이것은 간단한 확인이어야합니다.

예 1

var myObj = {"a": "test1"}

if(myObj.a == "test1") {
    alert("test1 exists!");
}

1
이것은 값이 아닌 키를 확인합니다.
— jcubic

1
사물은 프로토 타입 체인을 통과하며 예상대로 작동 할 것입니다. 예 : var a = {};<br/>'hasOwnProperty' in a' //true
— Noctisdark
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.