过滤阵列控制器与数组

时间:2015-01-25 14:06:00

标签: ember.js

如何使用数组过滤数组控制器中的内容?

我知道我可以为多个过滤器执行此操作:

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个过滤器,如果我可以用数组做这个过滤器会有所帮助。

如果有一种“蠢货”来做这件事会对我有所帮助。

3 个答案:

答案 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

Demo.

答案 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;
  }