Cara memeriksa apakah suatu nilai ada dalam suatu objek menggunakan JavaScript

104

Saya memiliki objek di JavaScript:

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

Bagaimana cara memeriksa bahwa test1 ada di objek sebagai nilai?

Brown KL
sumber
16
Wow..mereka yang menandainya sebagai duplikat sudah gila atau tidak tahu cara membaca bahasa Inggris. Bagaimanapun, dengan es7, Anda melakukan sesuatu seperti:Object.values(obj).includes('test1');
Mali Naeemi
2
Ini bukan duplikat (periksa kunci) yang dirujuk ke: stackoverflow.com/questions/1098040/…
Samuel Åslund

Jawaban:

126

Anda dapat mengubah nilai Objek menjadi larik dan menguji apakah ada string. Ini mengasumsikan bahwa Objek tidak bersarang dan stringnya sama persis:

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
sumber
8
Ini adalah bagian dari Ecma2017, ini belum tersedia untuk sebagian besar penggunaan :(
Ran Halprin
2
Tidak didukung di IE 11 dan Edge, lebih baik menggunakan for..in loop seperti yang dijelaskan di bawah ini
eugenesqr
25
Sedikit lebih sedikit bertele-tele: if(Object.values(obj).includes('test1')) { ... }
nickb
41

Anda dapat menggunakan metode Array .some:

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

Mencoba:

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

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

Atau

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

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

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

Ini tidak akan berhasil untuk NaNdan -0untuk nilai-nilai itu. Anda dapat menggunakan (alih-alih ===) apa yang baru di ECMAScript 6:

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

Dengan browser modern, Anda juga dapat menggunakan:

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

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

jcubic
sumber
25

Gunakan for...inloop:

for (let k in obj) {
    if (obj[k] === "test1") {
        return true;
    }
}
isvforall.dll
sumber
@Gregor tidak masalah karena 'k' didefinisikan lagi saat mengambil nilai berikutnya.
Vikrant
4
jawaban yang sangat diremehkan, kinerja yang satu ini lebih baik daripada metode lain
PirateApp
24

ES6 terpendek + satu liner:

let exists = Object.values(obj).includes("test1");
ayam
sumber
2
Ingatlah bahwa IE tidak mendukung .includes (), jadi gunakan hanya sisi server dengan Node atau jika Anda tidak peduli dengan IE.
João Pimentel Ferreira
19

Anda bisa menggunakan Object.values ​​() :

The Object.values()Metode mengembalikan array sendiri nilai properti enumerable suatu objek tertentu, dalam urutan yang sama seperti yang disediakan oleh for...inlingkaran (perbedaan adalah bahwa untuk-sifat lingkaran menyebutkan dalam rantai prototipe juga).

lalu gunakan metode indexOf () :

The indexOf()method mengembalikan indeks pertama di mana elemen tertentu dapat ditemukan dalam array, atau -1 jika tidak hadir.

Sebagai contoh:

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

Contoh yang lebih bertele-tele ada di bawah ini:

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

Tikus berbahaya
sumber
8

Saya melakukan tes dengan semua contoh ini, dan saya menjalankan ini di Node.js v8.11.2 . Ambil ini sebagai panduan untuk memilih pilihan terbaik Anda.

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

Output di server saya

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
sumber
6

Untuk satu baris, saya akan mengatakan:

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

Anda bisa mencoba ini:

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
sumber
0

Anda bisa mencoba yang ini

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

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

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

Fungsi yang disebut:

 getValue(obj, "a");
Penyewaan Devang
sumber
Apakah Anda menggunakan pustaka lain saat mengimplementasikan solusi ini?
Sherwin Ablaña Dapito
-1
var obj = {"a": "test1", "b": "test2"};
var getValuesOfObject = Object.values(obj)
for(index = 0; index < getValuesOfObject.length; index++){
    return Boolean(getValuesOfObject[index] === "test1")
}

Metode Object.values ​​() mengembalikan larik (ditugaskan ke getValuesOfObject) yang berisi nilai properti enumerable milik objek (obj) yang diberikan. Larik fordiulang menggunakan perulangan untuk mengambil setiap nilai (nilai dalam getValuesfromObject) dan mengembalikan fungsi Boolean () untuk mengetahui apakah ekspresi ("text1" adalah nilai dalam larik perulangan) benar.

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

Jawaban sederhana untuk ini diberikan di bawah ini.

Ini berfungsi karena setiap jenis JavaScript memiliki properti "konstruktor" pada prototipe itu ".

Masukkan deskripsi gambar di sini

Masukkan deskripsi gambar di sini

Mohd Sahil
sumber
4
Harap tambahkan kode Anda ke jawaban Anda sebagai teks dan bukan gambar, lihat juga Bagaimana cara memformat posting saya menggunakan Markdown atau HTML?
Vasil Velichkov
Harap transkripsikan kode pada gambar menjadi teks. Terima kasih sebelumnya.
Peter Mortensen
-7

Ini harus menjadi pemeriksaan sederhana.

Contoh 1

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

if(myObj.a == "test1") {
    alert("test1 exists!");
}
KpTheConstructor
sumber
1
Ini memeriksa kunci bukan nilainya.
jcubic
1
Sesuatu akan melintasi rantai prototipe dan mungkin akan bekerja seperti yang diharapkan!, Misalnya var a = {};<br/>'hasOwnProperty' in a' //true
Noctisdark