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

в 10:28, , рубрики: javascript, метки:

SteelToe — object, не стреляй мне в ногу! 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.

Автор: creage

Источник

Поделиться

* - обязательные к заполнению поля