基本的に、モデルの属性を繰り返し処理し、それらのキーと値をフィルターの属性と比較する必要があります。
self.models = _.filter(self.models, function (model) {
var fits = true; // does this model "fit" the filter?
model = model.toJSON();
_.each(model, function(modelVal, modelKey) {
_.each(filterArr, function(filter) {
if (modelKey === filter.field && modelVal !== filter.filter) {
fits = false
}
}
})
return fits
})
ただし、アンダースコアの魔法を少し使用すると、よりトリッキーな方法があります。性能的には良いかどうかはわかりませんが、私の目には確かに良く見えます。
// change a bit the way filter is described:
var filter = {Account: '123', Owner: 'Bob'},
// save an array of filter keys (Account, Owner)
filterKeys = _.keys(filter),
// and an array of its values (123, Bob)
filterVals = _.values(filter)
self.models = _.filter(self.models, function (model) {
// pick a subset of model which has the same keys as filter
var filteredSubset = _.pick(model.attributes, filterKeys),
// pick values of this subset
subsetValues = _.values(filteredSubset)
// this values have to be equal to filter's values
// (use .join() to turn array to string before comparison due to references)
return filteredVals.join() === subsetValues.join()
})
後者の場合、すべてのモデルがフィルターで宣言されたすべてのキーを持たなければならないことに注意してください。
私があなたであり、最も堅牢な方法を探していた場合、最初の例を書き直しますが_.each
、標準のfor
ループに変更してfalse
、最初の「適合しない」値が満たされるとすぐに戻ります。