Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 30.01.2019, 08:58
Аспирант
Отправить личное сообщение для Svorg Посмотреть профиль Найти все сообщения от Svorg
 
Регистрация: 16.11.2018
Сообщений: 38

Проверить существование пути вложенных полей в объекте
Есть объект, мне надо перебрать некоторый массив, который достаточно глубоко по "вложенности полей":
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. А то какая-то каша получается...
Спасибо!
Ответить с цитированием
  #2 (permalink)  
Старый 30.01.2019, 09:41
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,081

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));
Ответить с цитированием
  #3 (permalink)  
Старый 30.01.2019, 22:01
Аспирант
Отправить личное сообщение для Svorg Посмотреть профиль Найти все сообщения от Svorg
 
Регистрация: 16.11.2018
Сообщений: 38

Нагуглил ссылку по этому же вопросу: 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
Но видимо это то ли ещё не введено, то ли вовсе для какого-то "движка"...
Ответить с цитированием
  #4 (permalink)  
Старый 30.01.2019, 22:05
Аспирант
Отправить личное сообщение для Svorg Посмотреть профиль Найти все сообщения от Svorg
 
Регистрация: 16.11.2018
Сообщений: 38

А что профи скажут про такой вот финт?:
for (let Z of eval('try{Obj.tar.data.section.items}catch{[]}')) {
    ...
};
Ответить с цитированием
  #5 (permalink)  
Старый 31.01.2019, 02:26
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

Сообщение от 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)) //если есть, то что-то делаем
Ответить с цитированием
  #6 (permalink)  
Старый 31.01.2019, 04:30
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

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

Последний раз редактировалось Vlasenko Fedor, 31.01.2019 в 19:54.
Ответить с цитированием
  #7 (permalink)  
Старый 31.01.2019, 13:10
Аспирант
Отправить личное сообщение для Svorg Посмотреть профиль Найти все сообщения от Svorg
 
Регистрация: 16.11.2018
Сообщений: 38

Спасибо!
А что именно не так с eval?
Ответить с цитированием
  #8 (permalink)  
Старый 31.01.2019, 13:22
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 642

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

let obj = {
  a: {
    b: {
      c: 'd'
    }
  }
}
let { a: { b: { d } } } = obj
console.log(d) // undefined
let { a: { b: { c } } } = obj
console.log(c) // d
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как проверить заполненность полей в пошаговой форме? adash Элементы интерфейса 29 31.08.2018 14:15
Можно ли проверить запрос на существование массива? AleksSergSB Общие вопросы Javascript 4 21.11.2016 18:36
проверить находится курсор на объекте или нет agert Events/DOM/Window 3 20.01.2014 14:34
как проверить наличие элементов в объекте? гвоздик Общие вопросы Javascript 4 30.10.2009 11:33
Как проверить существование функции Aderba Общие вопросы Javascript 2 14.11.2008 16:09