下划线动态链接

时间:2016-11-24 13:47:07

标签: javascript arrays underscore.js filtering chaining

如果我有一个函数数组必须是_.filter方法的闭包,我怎样才能动态生成这个过滤器?

_filters : {
    shipped: function(order){ return order.get('is_shipped') },
    imported: function(order){ return order.get('is_imported') }
},

我想要的是能够像这样动态创建链

_.chain(orders).filter(filters.shipped).filter(filters.imported).value()

来自_filters对象中的闭包

也许有人有想法,如何在下划线中创建动态链接?

谢谢!

1 个答案:

答案 0 :(得分:2)

如果我理解你想要什么,你希望有一个动态数量的过滤器,应该应用于数组,如果是这样,你可以用_.values()从对象中提取过滤器,然后迭代他们使用_.every()。如果所有过滤器都返回true,则顺序将在结果数组中:

var filters = {
  shipped: function(order) {
    return order.get('is_shipped')
  },
  imported: function(order) {
    return order.get('is_imported')
  }
};

var filtersArray = _.values(filters);

var result = _.filter(orders, function(order) {
  return _.every(filters, function(filter) {
    return filter(order);
  });
});

您也可以不使用下划线进行过滤:

var filters = {
  shipped: function(order) {
    return order.get('is_shipped')
  },
  imported: function(order) {
    return order.get('is_imported')
  }
};

var filterKeys = Object.keys(filters);

var result = orders.filter(function(order) {
  return filterKeys.every(function(key) {
    return filter[key](order);
  });
});