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.