2014-01-07 62 views
1

是有可能使用的變量與_.js。哪裏?在underscore.js使用變量_.where

我提出的過濾系統,該系統獲取對象的數組並濾除上點擊所選擇的對象。但是,要篩選的對象根據所選元素的不同而不同,因此我希望使用_.js篩選傳遞給它的變量_.where

硬編碼值可以很好地工作,但當用副本變量替換時,它發射出一個空白陣列。

var user_filters = user_array; 
var filtered_text; 
$('.allFilters li').click(function() { 
    var $this = $(this); 
    var selected_filter = $this.siblings('a').text(); 
    selected_filter = selected_filter.toLowerCase(); 
    var filters = $this.attr('data-filter-value'); 
    filters = '"'+filters+'"'; 
    selected_filter = selected_filter; 
    console.log(selected_filter, filters); 
    user_filters = _.where(user_filters, {selected_filter: filters}); 
    console.log (user_filters); 
}); 
+2

我想你不需要'filters =''''+ filters +''';'。另外你可以創建一個[JSFiddle](http://jsfiddle.net/)? – Satpal

+0

我同意@Satpal。該行代碼將文字引號添加到「過濾器」的值中,可能會造成麻煩。我懷疑這種方法不工作,因爲你使用的是變量。 – Mark

+0

我現在正在演奏小提琴,但是如果我刪除{selected_filter:filters}並將其替換爲{test:「1」},則它可以很好地工作。我試圖從變量中刪除引號。不幸的是,還是一個空。 – Dreamlines

回答

2

調用時有一種使用變量的方法,其中,這是創建一個對象字面量其中期望。這可以通過使用下劃線功能_.object來完成,該功能可以採用一組鍵和一組值或一組鍵值對。

在您的例子,你可以這樣做:

user_filters = _.where(user_filters, _.object([[selectedFilter, filters]])); 
+0

從問題是否可能有多個selectedFilter和過濾器不是100%確定的。提出的解決方案假設一個,但可以很容易地轉換爲與許多工作。 –

0

我認爲你在尋找這樣的事情:

user_filters = user_filters.filter(function(item) { 
    return item[selected_filter] === filters; 
}); 

(並離開了filters = '"'+filters+'"';線)

或者,使用下劃線的filter

user_filters = _.filter(user_filters, function(item) { 
    return item[selected_filter] === filters; 
}); 
+0

這樣做的竅門,但仍然讓我想知道原始方法出了什麼問題。 編輯說非常感謝! – Dreamlines

+1

@Dreamlines你不能創建一個'動態'對象字面值,'key'部分(':'之前的部分)基於一個變量(這基本上是你要做的)。你必須使用更復雜的方式:var obj = {}; obj [variable] = value;'。 – robertklep

+0

這非常合理!非常感謝你的解釋,並花時間寫出來! – Dreamlines

0
如果用方括號包圍他們

變量可以使用:

在你的情況,你可以這樣做:

var selected_filter = $this.siblings('a').text(); 
    selected_filter = selected_filter.toLowerCase(); 

_.where(user_filters, {[selected_filter]: filters});