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