将动态键值对传递给函数



我可能忽略了一些东西,或者只是一个noob,但是,我很难将键值对传递给javascript函数。

我正在编写一个使用Backbone.View和Backbone.Planner.clientPager集合的筛选器模块。我在clientPager中添加了一个名为whereExpanded()的函数,该函数在不修改/呈现任何内容的情况下搜索整个集合。

Backbone.Paginator.clientPager.prototype.whereExpanded = function(attrs) {
  return _.filter(this.origModels, function(model) {
    var key;
    for (key in attrs) {
      if (attrs[key] !== model.get(key)) {
        return false;
      }
  });
};

正如你所看到的,它接受attrs变量并在其上循环。我希望能够将键值对传递给它,但键和值需要是动态的。

collection.whereExpanded(filterByField, filterByValue)

filterByField是骨干网的属性。我希望筛选的模型,filterByValue是我想要筛选的属性的值。我尝试过使用eval(),但似乎也无法实现。

任何帮助都将不胜感激!

您不需要eval,您可以用更好的方法构建对象:

var attrs = { };
attrs[filterByField] = filterByValue;

只要付出一点努力,你就可以用各种不同的方式调用你的函数:

whereExpanded({ k1: v1, k2: v2 });
whereExpanded('k1', v1);
whereExpanded('k1', v1, 'k2', v2);

您只需要自己用以下内容解析arguments

argv  = [].slice.call(arguments);
attrs = {};
if(argv.length == 1 && _(argv[0]).isObject()) {
    attrs = argv[0];
}
else if(argv.length % 2 == 0) {
    for(var i = 0; i < argv.length; i += 2) {
        attrs[argv[i]] = argv[i + 1];
    }
}
else {
    throw 'Bad argument list';
}

这将为您留下_.filter所期望的attrs中的键/值对。

参数解析演示:http://jsfiddle.net/ambiguous/e5kkc/

看起来eval()最终还是成功了。我是个笨蛋。

eval("collection.whereExpanded({" + filterByField + ": " + filterByValue + "})")

最新更新