Як перевірити, чи існує значення в об’єкті за допомогою JavaScript


103

У мене є об’єкт у JavaScript:

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

Як перевірити, чи існує test1 в об'єкті як значення?


16
Вау .. ті, хто позначив це як дублікат, або божевільні, або не знають, як читати англійську. У будь-якому випадку, з es7 ви робите щось на зразок:Object.values(obj).includes('test1');
Малі Наемі

2
От не дублювати (перевірка ключа) refered до: stackoverflow.com/questions/1098040 / ...
Семюел Åslund

Відповіді:


126

Ви можете перетворити значення Об'єкта в масив і перевірити наявність рядка. Він передбачає, що Об'єкт не вкладений і рядок є точною відповідністю:

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
Це частина Ecma2017, вона ще не доступна для більшості
застосунків

2
Не підтримується в IE 11 та Edge, краще використовувати for..in loop, як описано нижче
eugenesqr

24
Трохи менше багатослів'я: if(Object.values(obj).includes('test1')) { ... }
nickb

41

Ви можете використовувати метод Array .some:

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

36

Спробуйте:

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

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

Або

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

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

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

Це не буде працювати для цих цінностей NaNі -0для них. Ви можете використовувати (замість ===) те, що нового у ECMAScript 6:

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

З сучасними браузерами ви також можете використовувати:

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

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


24

Використовуйте for...inцикл:

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

@Gregor це не має значення, оскільки 'k' визначається знову, коли приймає наступне значення.
Вікрант

4
дуже недооцінена відповідь, ефективність на цьому краще, ніж будь-який інший метод
PirateApp

2
Погодьтеся з цим. дуже
занижена

22

Найкоротший ES6 + один вкладиш:

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

1
Майте на увазі, що IE не підтримує .includes (), тому використовуйте його лише на сервері з Node або якщо ви просто не переймаєтесь IE.
Жоао Піментель Феррейра,

19

Ви можете використовувати Object.values ​​() :

Object.values()Метод повертає масив власних значень перелічуваних властивостей даного об'єкта, в тому ж порядку , як це передбачено в for...inциклі ( з тією різницею, що протягом циклу перебирає властивості в ланцюжку прототипів, а).

а потім скористайтеся методом indexOf () :

indexOf()Метод повертає перший індекс , при якому даний елемент може бути знайдений в масиві, або -1 , якщо його немає.

Наприклад:

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

Нижче наведено більш детальний приклад:

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

Я провів тест з усіма цими прикладами і запустив це в Node.js v8.11.2 . Візьміть це як керівництво, щоб вибрати найкращий вибір.

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

Вивід на моєму сервері

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


2

Ви можете спробувати це:

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

Ви можете спробувати цей

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

Функція, що називається:

 getValue(obj, "a");

Чи використовували ви інші бібліотеки при впровадженні цього рішення?
Шервін Абланья Дапіто

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

Метод Object.values ​​() повернув масив (призначений getValuesOfObject), що містить власні перелічені значення властивості даного об'єкта (obj). Масив повторювався за допомогою forциклу для отримання кожного значення (значення в getValuesfromObject) і повертає функцію Boolean (), щоб з'ясувати, чи є вираз ("text1" значенням у циклічному масиві) істинним.



-4

Проста відповідь на це наведена нижче.

Це працює, тому що кожен тип JavaScript має в своєму прототипі властивість "конструктор ".

Введіть тут опис зображення

Введіть тут опис зображення


4
Будь ласка, додайте свій код до своєї відповіді як текст, а не як зображення, див. Також Як відформатувати свої дописи за допомогою Markdown або HTML?
Василь Величков

Будь ласка, перепишіть код із зображення в текст. Заздалегідь спасибі.
Пітер Мортенсен

-7

Це має бути проста перевірка.

Приклад 1

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

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

1
Ця перевірка ключа не значення.
jcubic

1
Річ пройде ланцюжок прототипів і, ймовірно, працюватиме, як очікувалося!, Наприклад var a = {};<br/>'hasOwnProperty' in a' //true
Noctisdark
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.