Pull to refresh

SteelToe — object, не стреляй мне в ногу!

Reading time2 min
Views5K
SteelToe — небольшой javascript сниппет, призванный решить проблему доступа к неопределенным свойствам объекта. Это особенно важно при обращении ко вложенным свойствам. В нем также реализована возможность автовивификации, что порядком упрощает создание нужных свойств. В общем — довольно полезный сахар в OOP.




Получение значений


Первый способ

var object = { info: { name: { first: 'Jonathan', last: 'Clem' } } }

steelToe(object)('info')('name')('last')();           // 'Clem'
steelToe(object)('info')('features')('hairColor')();  // undefined

Второй способ

var object = { info: { name: { first: 'Jonathan', last: 'Clem' } } }

steelToe(object).walk('info.name.last');          // 'Clem'
steelToe(object).walk('info.features.hairColor'); // undefined


Определение значений


var jonathan = { info: { name: { first: 'Jonathan', last: 'Clem' } } },

steelToe(jonathan).set('info.name.middle', 'Tyler');
steelToe(jonathan).set('info.favorites.movie', 'Harold & Maude');

jonathan.info.name.middle; // Tyler
jonathan.info.favorites.movie; // Harold & Maude


Что же тут происходит


Представьте — у вас есть сложный Javascript объект, с большой вложенностью свойств, который вы, допустим, получили из JSON. И, к примеру, вам требуется сделать что-то типа такого:

var fatherFirstNames = [];

for (var i = 0; i < families.length; i ++) {
  var first = families[i].father.info.name.first;

  if (first) {
    fatherFirstNames.push(first);
  }
}

// TypeError: 'undefined' is not an object (evaluating 'family.father.info.name.first')


— Блииин!, скажете вы — тупой выстрел в ногу! У вас запросто может вывалиться ошибка TypeError, т.к. ничто не гарантирует, что свойство father определено, или у него есть требуемые вам свойства. Обычно, чтобы предупредить ошибки подобного рода, мы пишем убогости, типа этой

var farherFirstNames = [];

for (var i = 0; i < families.length; i++) {
  var father = families[i].father;

  if (father && father.info && father.info.name && father.info.name.first) {
    fatherFirstNames.push(father.info.name.first);
  }
}


Буэээ… Смотрите, как элегантно решает эту проблему SteelToe!

var fatherFirstNames = [];

for (var i = 0; i < families.length; i++) {
  var name = steelToe(families[i]).walk('father.info.name.first');

  if (name) {
    fatherFirstNames.push(name);
  }
}

fatherFirstNames; // ["Hank", "Dale", "Bill"]


Больше никаких TypeError-ов! Счастье!

Библиотека представлена на сайте, и в github.
Tags:
Hubs:
+19
Comments35

Articles