Comment vérifier si une valeur existe dans un objet à l'aide de JavaScript


103

J'ai un objet en JavaScript:

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

Comment vérifier que test1 existe dans l'objet en tant que valeur?


16
Wow ... ceux qui l'ont marqué comme duplicata sont soit fous, soit ne savent pas lire l'anglais. Quoi qu'il en soit, avec es7, vous faites quelque chose comme:Object.values(obj).includes('test1');
Mali Naeemi

2
Voici le non dupliqué (vérifier la clé) référencé à: stackoverflow.com/questions/1098040/…
Samuel Åslund

Réponses:


126

Vous pouvez transformer les valeurs d'un objet en tableau et tester la présence d'une chaîne. Il suppose que l'objet n'est pas imbriqué et que la chaîne est une correspondance exacte:

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
Cela fait partie d'Ecma2017, il n'est pas encore disponible pour la plupart des utilisations :(
Ran Halprin

2
Non pris en charge dans IE 11 et Edge, il est préférable d'utiliser la boucle for..in comme décrit ci-dessous
eugenesqr

24
Légèrement moins verbeux: if(Object.values(obj).includes('test1')) { ... }
nickb

41

Vous pouvez utiliser la méthode Array .some:

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

36

Essayer:

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

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

Ou

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

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

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

Cela ne fonctionnera pas pour NaNet -0pour ces valeurs. Vous pouvez utiliser (au lieu de ===) ce qui est nouveau dans ECMAScript 6:

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

Avec les navigateurs modernes, vous pouvez également utiliser:

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

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


24

Utilisez une for...inboucle:

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

@Gregor cela n'a pas d'importance car 'k' est à nouveau défini lorsqu'il prend la valeur suivante.
Vikrant

4
réponse hautement sous-estimée, les performances de celle-ci sont meilleures que toute autre méthode
PirateApp

2
D'accord avec cela. réponse très sous-estimée ...
Samakaab

22

Le plus court ES6 + une doublure:

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

1
Notez cependant que IE ne prend pas en charge .includes (), alors utilisez-le uniquement côté serveur avec Node ou si vous ne vous souciez tout simplement pas d'IE.
João Pimentel Ferreira

19

Vous pouvez utiliser Object.values ​​() :

La Object.values()méthode renvoie un tableau des propres valeurs de propriété énumérables d'un objet donné, dans le même ordre que celui fourni par une for...inboucle (la différence étant qu'une boucle d'entrée énumère également les propriétés de la chaîne de prototypes).

puis utilisez la méthode indexOf () :

La indexOf()méthode renvoie le premier index auquel un élément donné peut être trouvé dans le tableau, ou -1 s'il n'est pas présent.

Par exemple:

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

Un exemple plus détaillé est ci-dessous:

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

J'ai fait un test avec tous ces exemples, et je l'ai exécuté dans Node.js v8.11.2 . Prenez ceci comme un guide pour sélectionner votre meilleur choix.

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

Sortie sur mon serveur

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

Pour un one-liner, je dirais:

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

2

Vous pouvez essayer ceci:

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

tu peux essayer celui-ci

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

Fonction appelée:

 getValue(obj, "a");

Avez-vous utilisé d'autres bibliothèques lors de la mise en œuvre de cette solution?
Sherwin Ablaña Dapito le

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

La méthode Object.values ​​() a renvoyé un tableau (affecté à getValuesOfObject) contenant les propres valeurs de propriété énumérables de l'objet donné (obj). Le tableau a été itéré à l'aide de la forboucle pour récupérer chaque valeur (valeurs dans getValuesfromObject) et renvoie une fonction Boolean () pour savoir si l'expression ("text1" est une valeur dans le tableau en boucle) est vraie.


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


-7

Cela devrait être une simple vérification.

Exemple 1

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

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

1
Ceci vérifie la clé et non la valeur.
jcubic

1
Thing traversera la chaîne de prototypes et fonctionnera probablement comme prévu!, Par exemple var a = {};<br/>'hasOwnProperty' in a' //true
Noctisdark
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.