У мене є об’єкт у JavaScript:
var obj = {
"a": "test1",
"b": "test2"
}
Як перевірити, чи існує test1 в об'єкті як значення?
У мене є об’єкт у JavaScript:
var obj = {
"a": "test1",
"b": "test2"
}
Як перевірити, чи існує test1 в об'єкті як значення?
Відповіді:
Ви можете перетворити значення Об'єкта в масив і перевірити наявність рядка. Він передбачає, що Об'єкт не вкладений і рядок є точною відповідністю:
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
if(Object.values(obj).includes('test1')) { ... }
Спробуйте:
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');
}
Використовуйте for...inцикл:
for (let k in obj) {
if (obj[k] === "test1") {
return true;
}
}
Найкоротший ES6 + один вкладиш:
let exists = Object.values(obj).includes("test1");
Ви можете використовувати 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
Я провів тест з усіма цими прикладами і запустив це в 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
Щодо однолінійного я б сказав:
exist = Object.values(obj).includes("test1");
console.log(exist);
Ви можете спробувати це:
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"); }));
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");
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" значенням у циклічному масиві) істинним.
if( myObj.hasOwnProperty('key') && myObj['key'] === value ){
...
}
Проста відповідь на це наведена нижче.
Це працює, тому що кожен тип JavaScript має в своєму прототипі властивість "конструктор ".
Це має бути проста перевірка.
Приклад 1
var myObj = {"a": "test1"}
if(myObj.a == "test1") {
alert("test1 exists!");
}
var a = {};<br/>'hasOwnProperty' in a' //true
Object.values(obj).includes('test1');