Объединение двух базовых коллекций и моделей в один объект с использованием подчеркивания

У меня есть две основные коллекции: категории и элементы. Категории содержат модели категорий с идентификатором, именем и элементами (w/c содержит идентификаторы элементов в строковом формате, разделенные запятыми) и коллекцию элементов, содержащую модели элементов (идентификатор, имя и т. д.).

Как мне объединить их в один объект, который можно легко отобразить в шаблоне руля?

Пример структуры:

var Categories = [{'id':'1', 'category_name':'Burgers', 'category_items':'1,2'},{'id':'2','category_name':'Drinks','category_items':'3'}];

var Items = [{'id':'1','item_name':'Burger 1'},{'id':'1','item_name':'Burger 2'},{'id':'1','item_name':'Chicken; 1'}];

Пример вывода:

var output = [{'id':'1', 'category_name':'Burgers', 'items':[{'id':'1','item_name':'Burger1', ...},{'id':'1','item_name':'Burger2', ...} ]}, {'id':'2', 'category_name':'Chicken', 'items':[{'id':'3','item_name':'Chicken1', ...} ]

И да, я достаточно старался, но у меня не получается


person user1076813    schedule 26.06.2013    source источник


Ответы (2)


Опираясь на полезные функции Underscore:

var json = _.map(c.toJSON(), function(c) {
  return _.extend(c, {
    category_items: _.map(c.category_items.split(','), function(id)                 {
      return i.get(id).toJSON();
    })
  });
});

http://jsfiddle.net/626x9/1/

Первый _.map в сочетании с _.extend просто служит для замены category_items. Я нахожу это довольно оскорбительным, но не могу вспомнить, есть ли какой-нибудь метод, который сделал бы это одним выстрелом.

person Loamhoof    schedule 26.06.2013
comment
вау, это код, который мне нужен, с меньшим количеством строк кода, я знаю, что все еще могу оптимизировать это, но трудно исследовать и экспериментировать с различными методами подчеркивания, в моей версии используется each, затем get, затем push, но мне нравится этот больше Спасибо... - person user1076813; 27.06.2013

Я пишу функцию под названием «mergeObjectWithId». Он объединяет данные из двух коллекций, выполнив следующие действия:

  1. Использование collection.findWhere() для получения целевой модели, которую необходимо объединить.
  2. Использование collection.where() для получения моделей в коллекции элементов.
  3. Затем назначьте массив элементов элементам свойств целевого объекта. Теперь вы получаете объект вывода, который вы хотели.

Попробуйте эту функцию:

function mergeObjectWithId(id){
  //assume categories is your Category collection instance
  var obj = categories.findWhere({id:id}).clone();
  //assume items is your Item collection instance
  obj.items = items.find({id:id}).slice(0);
  return obj;
}

var output = mergeObjectWithId(1);

Надеюсь, это будет полезно для вас.

person Chickenrice    schedule 26.06.2013
comment
спасибо, мне удалось создать ту же функцию, но вместо использования findWhere и/или find я использовал get, так как это уникальный идентификатор в коллекции. - person user1076813; 27.06.2013