Итак, в основном вы пытаетесь создать альтернативу _.has
из lodash
, но не хотите писать тысячу строк кода для обработки всех возможных угловых случаев. Вот более легкая версия has
, которую я реализовал для вас, которая не упадет, если данные будут несоответствующими (но, очевидно, она не будет обрабатывать столько же случаев, чем в lodash
).
Я просто просто взял 2 входа (в качестве аргумента) 1: SOurce, 2: путь (строка / ключи, разделенные точками, или массив строк), затем просто перебрал эти ключи и проверил, существует ли этот ключ или нет, если существует, я обновил текущий source как значение, которое содержит ключ, и следуют тому же процессу.
Вот фрагмент:
function has(src, path = []) {
let _path = Array.isArray(path) ? path.slice() : (path || '').split('.'),
o = src,
idx = 0;
if (_path.length === 0) {
return false;
}
for (idx = 0; idx < _path.length; idx++) {
const key = _path[idx];
if (o != null && o.hasOwnProperty(key)) {
o = o[key];
} else {
return false;
}
}
return true;
}
const obj1 = {a: {b: {c: {d: {e: {f: {g: { h: 210}}}}}}}};
//you can send the path as a array of sequential keys
console.log(has(obj1, ['a', 'b', 'c', 'd', 'e'])) // valid path
console.log(has(obj1, ['a', 'b', 'c', 'd', 'x', 'y'])) //invalid path
//Or, you can pass the path as a single string
console.log(has(obj1, 'a.b.c.d.e.f.g.h')) // valid path
console.log(has(obj1, 'a.x.y.b.c.d.e.f.g.h')) //invalid path