Проверить существование пути вложенных полей в объекте
Есть объект, мне надо перебрать некоторый массив, который достаточно глубоко по "вложенности полей":
for (let Z of Obj.tar.data.section.items) {
...
};
Но не факт что данный "путь" всегда будет существовать. Пару раз уже вылетало, пришлось дополнить как минимум вот так:
if (Obj.tar && Obj.tar.data) for (let Z of Obj.tar.data.section.items) {
...
};
А объект создаётся не мною, так что надо бы переделать полностью нормально. Может есть простой и надёжный способ проверить существование "пути" в объекте? Без всяких доп.библиотек, косолапых функций, бубнов и try. А то какая-то каша получается...Спасибо! |
Svorg,
вдруг это подходящий бубен ... :)
var params = 'props.header.slogan',
obj = {props: {header : {slogan : "всякая фигня"}}};
function fun(obj,params)
{
return params.split(".").every(function(key) {
return obj = obj[key]
}) && obj
}
alert(fun(obj , params));
|
Нагуглил ссылку по этому же вопросу: https://stackoverflow.com/questions/...ipt-object-key
И вот тут подробно объясняется зачем и красиво предлагается: Цитата:
|
:write: А что профи скажут про такой вот финт?:
for (let Z of eval('try{Obj.tar.data.section.items}catch{[]}')) {
...
};
|
Цитата:
вариант с рекурсией, так для разнообразия
var path = 'obj.tar.data';
var propChek = (arr, temp, i = 0) => i < arr.length - 1 && temp ? propChek(arr, temp[arr[++i]], i) : !!temp;
if(propChek(path.split('.'), obj)) //если есть, то что-то делаем
|
Еще вариант
const checkPath = (obj, path) => {
let keys = path.split('.'), key;
while (keys.length) {
key = keys.shift();
if (!Object.prototype.hasOwnProperty.call(obj, key)) {
return false;
}
obj = obj[key];
}
return true;
};
let path = 'props.header.slogan',
obj = {props: {header: {slogan: undefined}}};
console.log(checkPath(obj, path));
|
Спасибо!
А что именно не так с eval? |
Можно попробовать через деструктор
let obj = {
a: {
b: {
c: 'd'
}
}
}
let { a: { b: { d } } } = obj
console.log(d) // undefined
let { a: { b: { c } } } = obj
console.log(c) // d
|
| Часовой пояс GMT +3, время: 15:17. |