使用下划线合并重复的主干模型数据

时间:2013-01-31 21:43:45

标签: javascript backbone.js underscore.js

我有一个包含大量模型的集合,如下例所示:

{
    metricName : 'clicks',
    metricValue : 100
}

我想要的是搜索集合并将具有相同metricName的所有模型合并到一个具有所有值之和的模型中。

所以

{
    metricName : 'clicks',
    metricValue : 100
}

{
    metricName : 'otherMetric',
    metricValue : 100
}

{
    metricName : 'clicks',
    metricValue : 100
}

变成

{
    metricName : 'clicks',
    metricValue : 200
}

{
    metricName : 'otherMetric',
    metricValue : 100
}

我正试图通过使用下划线尽可能高效,轻松地解决这个问题。

我可以看到一个解决方案是使用_.each并循环并跟踪度量标准名称,同时对值进行求和并消除欺骗(听起来很蹩脚)。

我的问题是,是否有另一种更好的方法,使用下划线其他方法之一。我可以看到也许map,find,findwhere,filter等可能是选项,但我不确定。

2 个答案:

答案 0 :(得分:2)

你可以用groupByreduce做一些可爱的事情:

collection.reset(_.map(_.groupBy(collection.toJSON(), 'metricName'), function(group) {
  return _.reduce(group, function(memo, item) {
    if(!memo) return item;
    memo.metricValue+=item.metricValue;
    return memo;
  });
}));

答案 1 :(得分:0)

collection.add你可以

function onAdd(model){
    _.each(collection.where({metricName: model.get('metricName')}), function(item, i, array){
        item.set('metricValue', item.get('metricValue') + model.get('metricValue');
    });
}