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?


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


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

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


24

Usa un for...inbucle:

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

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

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


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

6

Para una sola línea, diría:

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

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

0

puedes probar este

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"
};

Función llamada:

 getValue(obj, "a");

¿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.


-3
if( myObj.hasOwnProperty('key') && myObj['key'] === value ){
    ...
}


-7

Esto debería ser una simple verificación.

Ejemplo 1

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

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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.