0

我有一页的长列表中显示了约 100 种产品的列表。每个产品属于一个类别,我大约有 5 个类别。每个产品都有一个 category_id。

我想为一个类别的每个第一个产品添加一个“.first”类,为一个类别的每个最后一个产品添加一个“.last”类。

性能是关键,我自己想出了一些解决方案,但写得非常糟糕而且太麻烦了。

示例数据:

products = {
   id: 1, category_id: 1;
   id: 2, category_id: 1;
   id: 3, category_id: 1;
   id: 4, category_id: 2;
   id: 5, category_id: 2;
   id: 6, category_id: 2;
   id: 7, category_id: 3;
   id: 8, category_id: 3;
   ...
}

我正在寻找的结果:

<ul>

  <li class='first' id='1'></li>
  <li id='2'></li>
  <li class='last' id='3'></li>

  <li class='first' id='4'></li>
  <li id='5'></li>
  <li class='last' id='6'></li>

  <li class='first' id='7'></li>
  <li id='8'></li>
  ...
</ul>

编辑:感谢您的帮助@niemand!我使用了 groupBy ,这就是我到目前为止所拥有的。这是解决这个问题的好方法,性能明智吗?

window.firsts = []
window.lasts = []
@grouped = _.groupBy(@collection.toJSON(), 'category_id')
_.each @grouped, (group) ->
  window.firsts.push new App.Models.Piece(_.first(group)).get('id')
  window.lasts.push new App.Models.Piece(_.last(group)).get('id')

这样,当我渲染每个模型视图并应用正确的类时,我可以检查 window.firsts 或 window.lasts 是否包含当前模型的 id。如果有一种更高效的方式来解决这个问题,我很想知道!

4

1 回答 1

0

用于Backbone.Collection.where({category_id: <category_id>})创建二维数组,其中包含按类别分组的模型。届时您将能够轻松找到所需的数据。

或者,如果您不介意类别中模型的顺序,那么只需Backbone.Collection.sortBy()遍历集合并查找 category_id 更改的所有索引。

如果您有一个 category_id 列表并且它很小,那么第一种方法会更好。第二个更适合大量数据。

编辑:

有一个下划线函数 groupBy() 用于集合!所以你应该使用它:collection.groupBy(function(model) {return model.get('category_id');});

于 2012-09-29T18:51:27.887 回答