Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Проверить существование пути вложенных полей в объекте (https://javascript.ru/forum/misc/76652-proverit-sushhestvovanie-puti-vlozhennykh-polejj-v-obekte.html)

Svorg 30.01.2019 08:58

Проверить существование пути вложенных полей в объекте
 
Есть объект, мне надо перебрать некоторый массив, который достаточно глубоко по "вложенности полей":
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. А то какая-то каша получается...
Спасибо!

рони 30.01.2019 09:41

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));

Svorg 30.01.2019 22:01

Нагуглил ссылку по этому же вопросу: https://stackoverflow.com/questions/...ipt-object-key

И вот тут подробно объясняется зачем и красиво предлагается:
Цитата:

Сообщение от `Optional Chaining Operator in JavaScript`
var user = { name: 'Joe' };
var zip = user?.address?.zip; // does not throw error
                                                       
console.log(zip); // undefined

Но видимо это то ли ещё не введено, то ли вовсе для какого-то "движка"...

Svorg 30.01.2019 22:05

:write: А что профи скажут про такой вот финт?:
for (let Z of eval('try{Obj.tar.data.section.items}catch{[]}')) {
    ...
};

j0hnik 31.01.2019 02:26

Цитата:

Сообщение от Svorg
А что профи скажут про такой вот финт?:

С eval надо быть крайне осторожным

вариант с рекурсией, так для разнообразия
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)) //если есть, то что-то делаем

Vlasenko Fedor 31.01.2019 04:30

Еще вариант
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));

Svorg 31.01.2019 13:10

Спасибо!
А что именно не так с eval?

SuperZen 31.01.2019 13:22

Можно попробовать через деструктор

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, время: 13:35.