如何使用数组过滤数组控制器中的内容?
我知道我可以为多个过滤器执行此操作:
App.ItemsController = Ember.ArrayController.extend({
filter: function() {
var content = this.get("content");
return content.filter(function(data) {
return (data.get("foo1")) &&
(data.get("foo2")) &&
(data.get("foo3"));
});
}
});
或只有一个:
return content.filterBy("foo1");
但如果我想用数组过滤,我该怎么做?
我想象这样的事情:
var array = ["foo1", "foo2", "foo3"];
return content.filterBy(array);
但这显然不起作用。
我问,因为我最多使用20个过滤器,如果我可以用数组做这个过滤器会有所帮助。
如果有一种“蠢货”来做这件事会对我有所帮助。
答案 0 :(得分:0)
我不确定我是否理解正确,但我会尝试一下:
var filters = ["a", "b", "c"];
var array = [{a: 1, b: 2, c: 3}, {a: 2, b: 3}]
var result = array.filter(function(item) {
var isPresent = true;
filters.forEach(function(filter) {
if (!Ember.isPresent(item[filter])) {
isPresent = false;
}
});
return isPresent;
});
或者如果你使用下划线或lodash:
var filters = ["a", "b", "c"];
var array = [{a: 1, b: 2, c: 3}, {a: 2, b: 3}]
var result = array.filter(function(item) {
return _.all(filters, function(filter) {
return Ember.isPresent(item[filter]);
});
});
同样如果您想将其与Ember结构一起使用,您可以将item[filter]
更改为item.get(filter)
。
答案 1 :(得分:0)
如果您的过滤器比简单检查属性更复杂,您可以创建一个函数数组,然后检查每个item
是否通过:
App.IndexRoute = Ember.Route.extend
model: ->
[
Em.Object.create
color: 'red'
isReallyRed: false
Em.Object.create
color: 'red'
Em.Object.create
color: 'red'
isReallyRed: true
]
App.IndexController = Em.ArrayController.extend
init: ->
@_super()
Em.run.next @, 'filterContent'
filters: [
(item) ->
item.get('color') is 'red'
, (item) ->
item.get('isReallyRed')
]
filterContent: ->
filters = @get 'filters'
result = @filter (item) ->
pass = true
filters.forEach (filter) ->
if pass
pass = filter item
pass
@set 'content', result
答案 2 :(得分:0)
我决定从andrusieczko和Daniels那里得到一些灵感来回答用对象而不是数组来过滤它。
App.ItemsController = Ember.ArrayController.extend({
filterlist: {},
filters: function() {
var self = this;
var content = this;
var filterlist = this.get("filterlist");
var allfilters = ["a", "b", "c"];
// set filterlist if any
allfilters.forEach(function(filter){
if ( self.get(filter) ) {
var value = self.get(filter);
filterlist[filter] = value;
}
});
// if equal or higher return y. else n.
function equal(item, key) {
var data = item.get(key);
var thefilter = self.get(key);
if ( data >= thefilter ) {
return "y";
} else {
return "n";
}
};
filter = content.filter(function(item) {
var pass = "";
if ( jQuery.isEmptyObject(filterlist) ) {
return true;
} else {
$.each(filterlist, function(key, value){
var pass2 = pass;
return pass = pass2 + equal(item, key);
});
if ( pass.indexOf("n") === -1 ) {
return pass;
}
}
});
return filter;
}