1

我有一个 Backbone 集合,我在其中迭代并查找 mdl.get('group')。这将返回:

[undefined, undefined, group, group, group, undefined, group, group, group, undefined, group, group]

我希望它返回的是这些组模型的数组(或集合):

[undefined, undefined, [group], undefined, [group], undefined, [group]

我试图想出最好的方法:

  • 遍历对象
  • 返回“未定义”值而不更改它们
  • 查找具有相似值的兄弟姐妹
  • 将它们折叠成一个数组,在对象内

很像 _.groupBy 方法,但我需要在对象中保留模型的正确顺序。

我会喜欢一些关于如何解决这个问题的想法。到目前为止,我在如何正确解决这个问题上磕磕绊绊。

谢谢!

4

2 回答 2

1

经过一番修修补补,想出了这个解决方案。我扩展了 Array.prototype 以便您可以轻松地将其放入。您可以从中创建一个 Underscore 扩展或 Collection.prototype 方法:

Array.prototype.pack = function(field) {
    var result = [], target, lastItem;
    while(this.length > 0) {
        var item = this.shift();
        if(item === undefined) {
            target = result;
        } else {
            if(!lastItem || item[field] != lastItem[field]) {
                target = [];
                result.push(target);
            }
        }
        target.push(item);
        lastItem = item;
    }
    return result;
}

请注意,它没有经过大量测试,并且可以肯定它可以改进,但应该给你一个想法。你可以像这样使用它:

models.pack("name")

其中模型是一个普通数组,如 [undefined, {field:value}]。

尽量简洁。这里有一个工作演示:http: //jsfiddle.net/YZQ6v/

于 2013-05-11T00:56:30.397 回答
0

您可以使用 collection.groupBy() 来执行此操作。首先 groupBy "group" 创建分组模型的哈希,然后使用 collection.map 将兄弟姐妹映射到模型上。

这是一个小提琴:http: //jsfiddle.net/puleos/w7drB/

var models = [
    {name: "Scott", group: "alpha"}, 
    {name: "Rose", group: "alpha"}, 
    {name: "Charles", group: "alpha"}, 
    {name: "Stan"}, 
    {name: "John"}, 
    {name: "Mary", group: "beta"}, 
    {name: "Dan", group: "beta"}, 
    {name: "Paul", group: "beta"}, 
    {name: "Grace"}, 
    {name: "Sarah", group: "omega"} 
];

var SourceCollection = Backbone.Collection.extend({});

var sourceCollection = new SourceCollection(models);
var grouped = sourceCollection.groupBy('group');

sourceCollection.map(function(model) {
  if(model.has("group")) {
      model.set({siblings: grouped[model.get("group")]});
  }
});

// sourceCollection with siblings 
console.log(sourceCollection);
于 2013-05-11T05:32:00.140 回答