0

我正在尝试过滤一个集合,然后对过滤后的值进行洗牌。

我正在考虑使用whereBackbone 提供的方法。就像是:

myRandomModel = @.where({ someAttribute: true }).shuffle()[0]

但是,where返回与属性匹配的所有模型的数组;并且显然shuffle需要一个列表来处理:

shuffle_ .shuffle(list)
返回列表的随机副本

http://documentcloud.github.com/underscore/#shuffle

有没有办法将我的模型数组变成“列表”?还是我应该自己写一些逻辑来完成这项工作?

4

4 回答 4

3

当下划线文档说list时,它们的意思是array。所以你可以_.shuffle这样使用:

shuffled = _([1, 2, 3, 4]).shuffle()

或者在你的情况下:

_(@where(someAttribute: true)).shuffle()

但是,由于您只是抓取一个模型,您可以简单地生成一个随机索引而不是改组:

matches = @where(someAttribute: true)
a_model = matches[Math.floor(Math.random() * matches.length)]
于 2012-10-20T16:37:21.760 回答
2

shuffle()andwhere()方法只是 Backbone 集合中下划线方法的代理。下划线方法仍然可以独立工作,以数组作为参数。这是我要做的:

myRandomModel = _.shuffle(@.where({ someAttribute: true }))[0]

参考:http ://documentcloud.github.com/underscore/#shuffle

PS:@“mu is too short”是对的,但是要获得一个模型,我会Math.random()自己走。

于 2012-10-20T20:14:34.317 回答
0

首先在您的收藏中,您应该有一个过滤功能 Like

var MyCollection = Backbone.Collection.extend ({
  filtered : function ( ) { 

通常你会使用 _.filter 来只获取你想要的模型,但你也可以使用 suffle 作为替代使用 this.models 来获取集合模型这里 shuffle 将混合模型

    var results = _ .shuffle( this.models ) ;

然后使用下划线映射您的结果并将其转换为 JSON 像这样

    results = _.map( results, function( model ) { return model.toJSON()  } );

最后返回一个只有结果的新主干集合,如果那是你正在寻找的,你可能只返回 json

    return new Backbone.Collection( results ) ;

请注意,如果您不想收集所有数据以供以后使用,您可以使用以下内容并忽略下面的视图;

    this.reset( results ) ;        
  }
});
于 2013-10-18T14:45:43.163 回答
0

我将以下内容放在我的 application.js 文件中(使用 Rails 3):

Array.prototype.shuffleArray = function() {
  var i = this.length, j, tempi, tempj;
  if ( i === 0 ) return false;
  while ( --i ) {
     j       = Math.floor( Math.random() * ( i + 1 ) );
     tempi   = this[i];
     tempj   = this[j];
     this[i] = tempj;
     this[j] = tempi;
  }
  return this;
};

现在我可以在数组数组上调用 shuffleArray() 了。不过暂时不要回答这个问题,因为我想知道是否有更好的方法来使用 Underscore/Backbone。

于 2012-10-20T15:59:10.300 回答