2015-07-04 1 views
0

Учитывая следующий путь, я хочу вернуть «имя», если это возможно, или «» иначе:Javascript лучшая практика для серии нулевых/неопределенных проверок

countries[0].states[0].cities[0].name 

Одним из вариантов является проверка шаг за шагом:

if(countries && countries[0]){ 
    var states = countries[0].states; 
    if(states && states[0]){ 
     var cities = states[0].cities; 
     if(cities && cities[0]){ 
      var name = cities[0].name; 
      if(name){ 
       return name; 
      } 
     } 
    } 
} 
return ""; 

Который многословный. Другим вариантом является обработка исключений:

try { 
    var name = countries[0].states[0].cities[0].name; 
    return name ? name : ""; // handle null or undefined 
} catch(err) { 
    return ""; 
} 

Но мы можем быть неудобно включать обработку исключений на обычной логике, и это также costs performance.

Есть ли еще короткий/чистый способ сделать это?

ответ

1

Если вы используете lodash.js или подчеркивания, вы могли бы сделать:

if (_.get(countries, '[0].states[0].cities[0].name')) { 

    } 
2

Вы можете построить помощника, чтобы сделать это:

function readProperties(object, path) { 
    return path.reduce(function (object, key) { 
     return object && object[key]; 
    }, object); 
} 
… 
return readProperties(countries, [0, 'states', 0, 'cities', 0, 'name']) || ''; 
Смежные вопросы