Come verificare se un valore esiste in un oggetto utilizzando JavaScript


103

Ho un oggetto in JavaScript:

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

Come posso verificare che test1 esista nell'oggetto come valore?


16
Wow ... quelli che lo hanno contrassegnato come duplicato o sono pazzi o non sanno leggere l'inglese. Ad ogni modo, con es7, fai qualcosa del tipo:Object.values(obj).includes('test1');
Mali Naeemi

2
Ecco il non duplicato (controlla la chiave) a cui fa riferimento: stackoverflow.com/questions/1098040/…
Samuel Åslund

Risposte:


126

È possibile trasformare i valori di un oggetto in un array e verificare che sia presente una stringa. Si presuppone che l'Oggetto non sia annidato e la stringa sia una corrispondenza esatta:

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
Questo fa parte di Ecma2017, non è ancora disponibile per la maggior parte degli usi :(
Ran Halprin

2
Non supportato in IE 11 ed Edge, è meglio usare for..in loop come descritto di seguito
eugenesqr

24
Un po 'meno if(Object.values(obj).includes('test1')) { ... }
prolisso

41

Puoi usare il metodo Array .some:

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

36

Provare:

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

Questo non funzionerà per NaNe -0per quei valori. Puoi usare (invece di ===) le novità in ECMAScript 6:

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

Con i browser moderni puoi anche utilizzare:

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

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


24

Usa un for...inloop:

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

@ Gregor non ha importanza in quanto 'k' viene definito di nuovo quando prende il valore successivo.
Vikrant

4
risposta altamente sottovalutata, le prestazioni su questo sono migliori di qualsiasi altro metodo
PirateApp

2
D'accordo con quello. risposta molto sottovalutata ...
Samakaab

22

ES6 più corto + una fodera:

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

1
Ricorda però che IE non supporta .includes (), quindi usalo solo lato server con Node o se semplicemente non ti interessa IE.
João Pimentel Ferreira

19

Puoi usare Object.values ​​() :

Il Object.values()metodo restituisce un array di valori di proprietà enumerabili di un dato oggetto, nello stesso ordine di quello fornito da un for...inciclo (con la differenza che un ciclo for-in enumera anche le proprietà nella catena del prototipo).

e poi usa il metodo indexOf () :

Il indexOf()metodo restituisce il primo indice in corrispondenza del quale un dato elemento può essere trovato nell'array, o -1 se non è presente.

Per esempio:

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

Di seguito è riportato un esempio più dettagliato:

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

Ho fatto un test con tutti questi esempi e l'ho eseguito in Node.js v8.11.2 . Prendi questo come una guida per selezionare la tua scelta migliore.

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

Uscita sul mio server

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

Per una battuta, direi:

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

2

Puoi provare questo:

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

puoi provare questo

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

Funzione chiamata:

 getValue(obj, "a");

Hai utilizzato altre librerie durante l'implementazione di questa soluzione?
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")
}

Il metodo Object.values ​​() ha restituito un array (assegnato a getValuesOfObject) contenente i valori delle proprietà enumerabili (obj) dell'oggetto specificato. L'array è stato iterato utilizzando il forciclo per recuperare ogni valore (valori in getValuesfromObject) e restituisce una funzione Boolean () per scoprire se l'espressione ("text1" è un valore nell'array a ciclo continuo) è vera.


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


-7

Questo dovrebbe essere un semplice controllo.

Esempio 1

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

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

1
Questo controlla la chiave non il valore.
jcubic

1
La cosa attraverserà la catena del prototipo e probabilmente funzionerà come previsto!, Ad esempio var a = {};<br/>'hasOwnProperty' in a' //true
Noctisdark
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.