2016-11-24 1 views
1

Wenn ich ein Array von Funktion, die Schließungen für _.filter Methode sein müssen, wie kann ich diesen Filter dynamisch machen?Underscore dynamische Verkettung

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

Was ich will, ist die Fähigkeit zu haben, um dynamisch die Kette wie diese

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

von Schließungen in DASS zu erstellen sind in _filters Objekt

Vielleicht hat jemand die Idee hat, wie das Erstellen Unterstreichung dynamisch verketten?

Danke!

Antwort

2

Wenn ich verstehe, was Sie wollen, möchten Sie eine dynamische Anzahl von Filtern haben, die auf das Array angewendet werden soll. Wenn ja, können Sie die Filter aus dem Objekt mit _.values() extrahieren und dann iterieren sie mit _.every() . Wenn alle Filter true zurückkehren, wird die Reihenfolge, in der sich ergebenden Array sein:

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

Sie können auch tun, um die Filterung ohne Unterstrich:

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

Dank !! Genau das habe ich gesucht :) – Toletov