ms-dred
@ms-dred
Вечно что то не то и что то не так...

Как проверить два объекта по шаблону?

Подскажите как по проще реализовать данную проверку
Мне нужно сравнить два объекта и выполнить действие только в том случае если они "относительно" одинаковые
Первый объект что то вроде шаблона, вот он
{
 d: "какие то слова к которым не нужно привязываться, главное что бы был ключ d",
 m: "Числовое целое поле"
}


Второй объект может иметь расширенные пары ключ:значение
{
 d: "слово",
 m: 23,
 s: "слово 2"
}

Мне нужно сделать проверку второго объекта чтобы он соответствовал шаблону, где
q - просто присутствует и не важно его значение
m - пропустить только в том случае если оно равно цифре 1
s - в случае нахождения во втором объекте других ключей, отличных от d и m, не выполнять ничего

Другими словами мне нужно выполнить действие только в том случае если второй объект имеет вид
{
 d: "*",
 m: 1
}


В голову приходит только много костылей с проверкой Object.keys и сравнение поля m, но может есть какой то универсальный вариант, более короткий и более изящный что ли. =)
  • Вопрос задан
  • 120 просмотров
Решения вопроса 1
Stalker_RED
@Stalker_RED
Если писать проверку кодом, то все просто
function check(data) {
	return Object.hasOwn(data, 'd') && data.m === 1;
}

https://jsfiddle.net/wzt492vL/

Если нужен именно объект с правилами, то записать в него регулярки, например?
const rule = {
 d: /.+/,
 m: /1/,
}

function check(data) {
	let result = true;
  for (const key in rule) {
    if (!Object.hasOwn(data, key)) return false;
    if(!rule[key].test(data[key])) return false;
  }
  return result;
}
https://jsfiddle.net/8u46rw3d/
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Enokin
@Enokin
Full-stack разработчик
const template = {
    d: "какие то слова к которым не нужно привязываться, главное что бы был ключ d",
    m: "Числовое целое поле"
};

function validateAgainstTemplate(obj, template) {
    let keys = Object.keys(obj);
    for (let key of keys) {
        if (!template.hasOwnProperty(key)) return false;  // если в шаблоне нет такого ключа
        if (key === "m" && obj[key] !== 1) return false;  // если значение ключа m не равно 1
    }
    return true;  // если все проверки пройдены
}

let testObj1 = {
    d: "слово",
    m: 1
};

let testObj2 = {
    d: "слово",
    m: 23,
    s: "слово 2"
};

console.log(validateAgainstTemplate(testObj1, template));  // true
console.log(validateAgainstTemplate(testObj2, template));  // false
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы