So überprüfen Sie mithilfe von JavaScript, ob in einem Objekt ein Wert vorhanden ist


102

Ich habe ein Objekt in JavaScript:

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

Wie überprüfe ich, ob test1 im Objekt als Wert vorhanden ist?


16
Wow ... diejenigen, die es als Duplikat markiert haben, sind entweder verrückt oder wissen nicht, wie man Englisch liest. Wie auch immer, mit es7 machen Sie so etwas wie:Object.values(obj).includes('test1');
Mali Naeemi

2
Hier ist das nicht Duplikat (auf Schlüssel prüfen), auf das verwiesen wird: stackoverflow.com/questions/1098040/…
Samuel Åslund

Antworten:


124

Sie können die Werte eines Objekts in ein Array umwandeln und testen, ob eine Zeichenfolge vorhanden ist. Es wird davon ausgegangen, dass das Objekt nicht verschachtelt ist und die Zeichenfolge genau übereinstimmt:

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
Dies ist Teil von Ecma2017, es ist noch nicht für die meisten Anwendungen verfügbar :(
Ran Halprin

2
Wird in IE 11 und Edge nicht unterstützt, ist es besser, for..in loop wie unten beschrieben zu verwenden
eugenesqr

24
Etwas weniger ausführlich: if(Object.values(obj).includes('test1')) { ... }
Nickb

40

Sie können die Array-Methode verwenden .some:

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

34

Versuchen:

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

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

Oder

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

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

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

Dies funktioniert für NaNund -0für diese Werte nicht. Sie können (anstelle von ===) dem verwenden, was in ECMAScript 6 neu ist:

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

Mit modernen Browsern können Sie auch Folgendes verwenden:

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

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


24

Verwenden Sie eine for...inSchleife:

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

@ Gregor spielt keine Rolle, da 'k' erneut definiert wird, wenn der nächste Wert angenommen wird.
Vikrant

4
stark unterschätzte Antwort, die Leistung auf dieser ist besser als jede andere Methode
PirateApp

2
Stimmen Sie dem zu. sehr unterschätzte Antwort ...
Samakaab

20

Kürzester ES6 + ein Liner:

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

1
Beachten Sie jedoch, dass der IE .includes () nicht unterstützt. Verwenden Sie ihn daher nur serverseitig mit Node oder wenn Sie sich einfach nicht für den IE interessieren.
João Pimentel Ferreira

19

Sie können Object.values ​​() verwenden :

Die Object.values()Methode gibt ein Array der eigenen aufzählbaren Eigenschaftswerte eines bestimmten Objekts in derselben Reihenfolge zurück, die von einer for...inSchleife bereitgestellt wird (der Unterschied besteht darin, dass eine For-In-Schleife auch Eigenschaften in der Prototypkette auflistet).

und verwenden Sie dann die indexOf () -Methode:

Die indexOf()Methode gibt den ersten Index zurück, an dem ein bestimmtes Element im Array gefunden werden kann, oder -1, wenn es nicht vorhanden ist.

Beispielsweise:

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

Ein ausführlicheres Beispiel finden Sie unten:

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

Ich habe einen Test mit all diesen Beispielen durchgeführt und diesen in Node.js v8.11.2 ausgeführt . Nehmen Sie dies als Leitfaden, um Ihre beste Wahl zu treffen.

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

Ausgabe auf meinem 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

Für einen Einzeiler würde ich sagen:

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

2

Sie können dies versuchen:

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

Sie können dieses versuchen

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

Funktion aufgerufen:

 getValue(obj, "a");

Haben Sie bei der Implementierung dieser Lösung andere Bibliotheken verwendet?
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")
}

Die Object.values ​​() -Methode hat ein Array zurückgegeben (getValuesOfObject zugewiesen), das die eigenen aufzählbaren Eigenschaftswerte des angegebenen Objekts (obj) enthält. Das Array wurde mithilfe der forSchleife iteriert , um jeden Wert (Werte im getValuesfromObject) abzurufen, und gibt eine Boolean () -Funktion zurück, um herauszufinden, ob der Ausdruck ("text1" ist ein Wert im Schleifenarray) wahr ist.


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


-7

Dies sollte eine einfache Überprüfung sein.

Beispiel 1

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

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

1
Dies überprüft den Schlüssel, nicht den Wert.
Jcubic

1
Die Sache wird die Prototypenkette durchqueren und wahrscheinlich wie erwartet funktionieren! Zum Beispiel var a = {};<br/>'hasOwnProperty' in a' //true
Noctisdark
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.