JSFiddle - React, Tailwind, and code Playground

by Proger

HTML

<script src="//cdnjs.cloudflare.com/ajax/libs/underscore.js/1.7.0/underscore-min.js"></script>
<script src="http://squizzle.me/js/sqimitive/sqimitive.min.js"></script>

JavaScript

var MyModel = Sqimitive.Sqimitive.extend({
  _opt: {
    id: 0,
    date: new Date,
    parents: [],
    caption: '',
  },

  // Мы можем и полностью переписать сам assignResp для этого класса, но
  // намного проще настроить его поведение с помощью этого блока.
  _respToOpt: {
    // Простое переименование исходного ключа.
    thisID: 'id',

    // Произвольное сложное преобразование. Функция возвращает массив, где
    // первый элемент - имя конечной опции, а значение - значение опции для присвоения.
    date: function (str) {
      return ['date', new Date(str)]
    },

    // Игнорирование ключа.
    junk: false,

    parents: function (str) {
      return ['parents', str.split(/\s+/)]
    },

    // Принятия ключа/значения как есть. Аналогично caption: 'caption'.
    caption: true,
  },

  // Всё, что ниже - не обязательно, но поможет поддерживать значения в чистоте.
  normalize_id: function (value) {
    var id = parseInt(value)
    if (isNaN(id)) { throw 'What kind of ID is that?' }
    return id
  },

  normalize_parents: function (value) {
    return _.map([].concat(value), this.normalize_id, this)
  },

  normalize_caption: function (value) {
    return value.replace(/^\s+|\s+$/g, '')
  },
})

var model = new MyModel

model.assignResp({
  'thisID':    123,
  'date':     '2014-10-03T10:26:22+03:00',
  'parents':  '1 2 3',
  'junk':     'ONk49Xo3SxEps8uCV9je',
  'caption':  'Имя',
})

$('body').text(JSON.stringify(model.get()))