Cómo verificar si existe un valor en un objeto usando JavaScript

102

Tengo un objeto en JavaScript:

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

¿Cómo verifico que test1 existe en el objeto como un valor?

Marrón KL
fuente
16
Vaya ... los que lo marcaron como duplicado están locos o no saben leer en inglés. De todos modos, con es7, haces algo como:Object.values(obj).includes('test1');
Mali Naeemi
2
Aquí está el no duplicado (verifique la clave) al que se hace referencia: stackoverflow.com/questions/1098040/…
Samuel Åslund

Respuestas:

125

Puede convertir los valores de un objeto en una matriz y probar que hay una cadena. Asume que el Objeto no está anidado y la cadena es una coincidencia exacta:

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

Matt Pileggi
fuente
8
Esto es parte de Ecma2017, aún no está disponible para la mayoría de los usos :(
Ran Halprin
2
No es compatible con IE 11 y Edge, es mejor usar for..in loop como se describe a continuación
eugenesqr
24
Un poco menos detallado: if(Object.values(obj).includes('test1')) { ... }
nickb
40

Puede utilizar el método Array .some:

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

Tratar:

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

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

O

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

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

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

Esto no funcionará para NaNy -0para esos valores. Puede usar (en lugar de ===) las novedades de ECMAScript 6:

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

Con los navegadores modernos también puede utilizar:

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

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

jcubic
fuente
24

Usa un for...inbucle:

for (let k in obj) {
    if (obj[k] === "test1") {
        return true;
    }
}
isvforall
fuente
@Gregor, no importa ya que 'k' se define nuevamente cuando toma el siguiente valor.
Vikrant
4
respuesta altamente subestimada, el rendimiento en este es mejor que cualquier otro método
PirateApp
2
De acuerdo con eso. respuesta muy subestimada ...
Samakaab
22

ES6 + un trazador de líneas más corto:

let exists = Object.values(obj).includes("test1");
pollos
fuente
1
Sin embargo, tenga en cuenta que IE no es compatible con .includes (), así que utilícelo solo en el lado del servidor con Node o si simplemente no le importa IE.
João Pimentel Ferreira
19

Puede utilizar Object.values ​​() :

El Object.values()método devuelve una matriz de valores de propiedad enumerables propios de un objeto dado, en el mismo orden que el proporcionado por un for...inbucle (la diferencia es que un bucle for-in también enumera las propiedades en la cadena del prototipo).

y luego use el método indexOf () :

El indexOf()método devuelve el primer índice en el que se puede encontrar un elemento dado en la matriz, o -1 si no está presente.

Por ejemplo:

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

A continuación, se muestra un ejemplo más detallado:

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

Ratón peligroso
fuente
8

Hice una prueba con todos estos ejemplos y ejecuté esto en Node.js v8.11.2 . Toma esto como una guía para seleccionar tu mejor opción.

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")

Salida en mi servidor

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
DarckBlezzer
fuente
6

Para una sola línea, diría:

exist = Object.values(obj).includes("test1");
console.log(exist);
Joshua Shibu
fuente
2

Puedes probar esto:

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"); }));
Yokki vallayok
fuente
0

puedes probar este

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

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

findSpecificStr(obj, 'test1');
fengxh
fuente
-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"
};

Función llamada:

 getValue(obj, "a");
Alquiler de Devang
fuente
¿Usó otras bibliotecas al implementar esta solución?
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")
}

El método Object.values ​​() devolvió una matriz (asignada a getValuesOfObject) que contiene los valores de propiedad enumerables propios del objeto dado (obj). La matriz se repitió utilizando el forbucle para recuperar cada valor (valores en getValuesfromObject) y devuelve una función booleana () para averiguar si la expresión ("texto1" es un valor en la matriz de bucle) es verdadera.

chukwuemeka aigbokhan
fuente
-3
if( myObj.hasOwnProperty('key') && myObj['key'] === value ){
    ...
}
Noctisdark
fuente
-4

La respuesta simple a esto se da a continuación.

Esto funciona porque cada tipo de JavaScript tiene una propiedad de “constructor” en su prototipo ”.

Ingrese la descripción de la imagen aquí

Ingrese la descripción de la imagen aquí

Mohd Sahil
fuente
4
Agregue su código a su respuesta como texto y no como imagen, consulte también ¿Cómo doy formato a mis publicaciones usando Markdown o HTML?
Vasil Velichkov
Transcriba el código de la imagen en texto. Gracias por adelantado.
Peter Mortensen
-7

Esto debería ser una simple verificación.

Ejemplo 1

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

if(myObj.a == "test1") {
    alert("test1 exists!");
}
KpTheConstructor
fuente
1
Esto verifica la clave, no el valor.
jcubic
1
¡La cosa atravesará la cadena del prototipo y probablemente funcionará como se esperaba!, Por ejemplo var a = {};<br/>'hasOwnProperty' in a' //true
Noctisdark