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?


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


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

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


25

Gunakan for...inloop:

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

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

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


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

6

Untuk satu baris, saya akan mengatakan:

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

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

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

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

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.


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


-7

Ini harus menjadi pemeriksaan sederhana.

Contoh 1

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

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.