簡體   English   中英

將動態鍵值對傳遞給函數

[英]Passing dynamic key-value pairs to function

我可能忽略了某些東西,或者只是一個菜鳥而已,但是我無法將鍵值對傳遞給javascript函數。

我正在使用Backbone.View和Backbone.Paginator.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是Backbone.Model的屬性,我希望過濾的對象, 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 + "})")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM