2016-11-24 12 views
1

Если у меня есть массив функций, который должен быть закрытием для метода _.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 объект

Может быть кто-то есть идея, как создать динамически цепочки в подчеркивании?

Спасибо!

ответ

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); 
    }); 
}); 
+0

Спасибо !! Это именно то, что я искал :) – Toletov