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

Javascript 使用下划线将两个主干集合和模型合并到一个对象中,javascript,backbone.js,underscore.js,javascript-objects,Javascript,Backbone.js,Underscore.js,Javascript Objects,我有两个主干集合类别和项目,类别包含id、名称和项目的类别模型(w/c包含以逗号分隔的字符串格式的项目id)和包含项目模型(id、名称等)的项目集合 如何将它们合并到一个可以在把手模板中轻松渲染的对象中 示例结构: var Categories = [{'id':'1', 'category_name':'Burgers', 'category_items':'1,2'},{'id':'2','category_name':'Drinks','category_items':'3'}]; va

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

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

示例结构:

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', ...} ]
样本输出:

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', ...} ]
是的,我尝试了很多,但似乎无法管理它

我编写了一个名为“mergeObjectWithId”的函数。按照以下步骤合并两个集合中的数据:

  • 使用获取需要合并的目标模型
  • 用于获取项目集合中的模型
  • 然后将项数组指定给目标对象的属性项。现在您得到了想要的输出对象
  • 尝试此功能:

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

    希望这对您有所帮助。

    依靠下划线的有用功能:

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


    第一个
    \uu.map
    \uu.extend
    结合使用,仅用于替换
    类别项目
    。我发现它非常滥用,但记不起是否有任何方法可以一次性实现这一点。

    谢谢,我设法创建了相同的函数,但没有使用findWhere和/或find,而是使用get,因为它是集合中唯一的id。哇,这是我需要的代码,代码行数更少,我知道我仍然可以优化它,但很难探索和实验各种下划线方法,我的版本使用
    每个
    ,然后
    获取
    然后
    推送
    ,但我更喜欢这个方法,谢谢。。。