У меня есть такой объект:
const obj = {
name: "one",
created: "2022-05-05T00:00:00.0Z",
something: {
here: "yes"
}
}
Я могу проверить, есть ли у него определенные атрибуты один за другим:
assert( obj.name!== undefined && obj.name === "one")
assert( obj.something!== undefined && obj.something.here!== undefined && obj.something.here === "yes")
Есть ли способ добиться того же, передав другой объект для сравнения? Другой объект будет иметь меньше значений (в этом примере мне все равно, created
присутствует ли атрибут)
Что-то вроде:
const obj = {
name: "one",
created: "2022-05-05T00:00:00.0Z",
something: {
here: "yes"
}
}
hasAllOf(obj, {
name: "one",
something: {
here: "yes"
}
}) // returns true
Либо с lodash, либо с какой-то другой библиотекой?
Решение проблемы
Вы можете писать рекурсивно hasAllOf
с помощью помощника по проверке типов, is
-
const is = (t, T) =>
t?.constructor === T
const hasAllOf = (a, b) =>
is(a, Object) && is(b, Object) || is(a, Array) && is(b, Array)
? Object.keys(b).every(k => hasAllOf(a[k], b[k]))
: a === b
const obj = {
name: "one",
created: "2022-05-05T00:00:00.0Z",
something: {
here: "yes",
and: ["this", 2, { f: "three" }]
}
}
console.log(
hasAllOf(obj, {
name: "one",
something: {
here: "yes",
and: ["this", 2, { f: "three" }]
}
})
)
Комментариев нет:
Отправить комментарий