【问题标题】:Backbone.js: How do I filter a collection of objects by an array of model IDs?Backbone.js:如何通过模型 ID 数组过滤对象集合?
【发布时间】:2011-09-20 12:35:22
【问题描述】:

我有一个充满模型的Backbone.Collection;假设模型是Car。这个集合是一个很棒的Cars 列表。我希望能够从列表中选择一些特定的汽车 ID,然后能够从该集合中仅获取那些选定的汽车对象。

我下面的代码块不起作用;我确信有一种方法可以使用 Backbone.js/Underscore.js 来做到这一点……我对 Backbone/Underscore 也很陌生。

CarList = Backbone.Collection.extend({
    model: Car,
    filterWithIds: function(ids) {
        return this.filter(function(aCar) { return _.contains(ids, car.id); }
    }
});

任何指针?

【问题讨论】:

  • 传递给this.filter 的匿名函数缺少返回语句。与其他一些语言(例如 Ruby)不同,JavaScript 不使用函数中的最后一个表达式作为默认返回值。 (另外,将this 分配给coll 的行是多余的。)
  • 你说得对,Niall……我正在通过观察从 CoffeeScript 翻译我的代码,但我忽略了它;在简化我的代码时,我不小心留下了多余的行。我已经修复了我的代码示例。

标签: javascript collections filter backbone.js underscore.js


【解决方案1】:

好的,我想我明白了。它接近我的原始代码块,但更新的filterWithIds 函数在这里。

filterWithIds: function(ids) {
    return _(this.models.filter(function(c) { return _.contains(ids, c.id); }));
}

对于那些关注 CoffeeScript 的人(我是),这里是 CoffeeScript 版本。

filterWithIds: (ids) -> _(@models.filter (c) -> _.contains ids, c.id)

这是我的答案;有什么代码味道吗?

【讨论】:

  • 您可以尝试使用条件c.id in ids,而不是使用include,coffeescript 将其转换为for 循环,根据c.id 检查每个id。
  • 自发布此答案以来,include 已重命名为 contains
猜你喜欢
  • 1970-01-01
  • 2014-03-12
  • 1970-01-01
  • 1970-01-01
  • 2023-02-11
  • 2022-11-27
  • 2011-10-27
  • 1970-01-01
相关资源
最近更新 更多