2016-11-24 6 views
1

_.filterメソッドのクロージャでなければならない関数の配列がある場合、どのようにこのフィルタを動的に作成できますか?アンダースコアの動的連鎖

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

私が欲しいのは_filtersの作成方法を、

はたぶん誰かがアイデアを持っているオブジェクトであるという点で、動的に閉鎖からこの

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

のようにチェーンを作成する能力を有することがありますアンダースコアで動的に連鎖する?

ありがとうございます!

答えて

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