4

В javascript У меня много кода, подобного этому.Оператор javascript ignore-if-null?

if (ctrl && ctrl.main && ctrl.main.user) { 
    SetTheme(ctrl.main.user.theme); 
} 

, который досадно длинный. На других языках вы можете просто

SetTheme(ctrl?.main?.user?.theme); 

Есть ли способ сделать это в javascript?

Я попытался,

function safeGet(a,b) { return a ? a[b] : null; } 

и

SetTheme(safeGet(safeGet(safeGet(ctrl, 'main'), 'user'), 'theme')); 

Но это не очень читаемым.

+0

Логическое И оператор '' && является лучшим выбором в JavaScript. Во всяком случае, это больше похоже на рассказ о JS для меня, чем вопрос. – Timo

+0

да, извините. переформулированный как менее простенький –

+0

@Timo Он просил решения - не только разглагольствования – hack3rfx

ответ

1

Правильный короткий отрезок может быть

if (((ctrl || {}).main || {}).user) { // ... 

Или вы можете использовать массив как путь или точку разделите строку как путь и проверьте существование и верните значение.

function getValue(object, path) { 
 
    return path.split('.').reduce(function (o, k) { 
 
     return (o || {})[k]; 
 
    }, object); 
 
} 
 

 
var ctrl = { main: { user: { theme: 42 } } }; 
 

 
console.log(getValue(ctrl, "main.user.theme"));

+1

очень приятно. Мне нравится использование '||'. –

1

Вы можете создать обобщенную функцию, чтобы сделать это, передавая ему строку, представляющую путь к вложенной собственности вы хотите:

function getValue(object, prop, /*optional*/ valIfUndefined) { 
      var propsArray = prop.split("."); 
      while(propsArray.length > 0) { 
       var currentProp = propsArray.shift(); 
       if (object.hasOwnProperty(currentProp)) { 
        object = object[currentProp]; 
       } else { 
        if (valIfUndefined) { 
         return valIfUndefined; 
        } else { 
         return undefined; 
        } 
       } 
      } 

      return object; 
     } 

Затем использовать это на любом объекте, как:

// This will return null if any object in the path doesn't exist 
if (getValue(ctrl, 'main.user', null)) { 
    // do something 
} 
+0

OP упоминает отсутствие читаемости – hack3rfx

+0

Я бы предположил, что отсутствие читаемости относится к вложенным вызовам «saveGet». Это решение не страдает от этой проблемы. – mcgraphix

+0

Правда, я думаю, вы не можете быть слишком придирчивым, работая с JS – hack3rfx