使用下划线将两个主干集合和模型合并到一个对象中

时间:2013-06-26 07:46:41

标签: javascript backbone.js underscore.js javascript-objects

我有两个主干集合类别和项目,类别包含具有id,名称和项目的类别模型(w / c包含以逗号分隔的字符串格式的项目ID)和包含项目模型的项目集合(id,name等) )。

如何将它们合并到一个可以在手柄模板中轻松渲染的对象

示例结构:

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', ...} ]

是的,我已经尝试了,但我似乎无法管理它

2 个答案:

答案 0 :(得分:1)

我编写了一个名为“mergeObjectWithId”的函数。它合并来自两个集合的数据遵循以下步骤:

  1. 使用collection.findWhere()获取需要合并的目标模型。
  2. 使用collection.where()获取项目集合中的模型。
  3. 然后将items数组分配给目标对象的属性项。现在你得到了你想要的输出对象。
  4. 尝试此功能:

    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);
    

    希望这对你有所帮助。

答案 1 :(得分:1)

依靠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。我发现它非常侮辱,但不记得是否有任何方法可以一次性完成。