6天前,我问过这个问题:
how to select from filtervalues where genre comma delimited values contain only what is selected
我得到了答案;并且一位研究员为解决方案提供了这个小提琴:https://jsfiddle.net/AnishPatelUk/7swLn92c/
但我遇到了另一个问题。虽然我让它搜索匹配的逗号字符串并返回匹配的长度等于数组。此代码不完整。
目标是让用户选择多个类型并显示这些类型。但是当用户选择媒体类型如DVD或Bluray时。结果应显示来自流派的所有项目为DVD和/或蓝光。
例如:
用户选择:冒险,科幻,然后是蓝光;只有星球大战和黑客应该出现。
如果用户选择:冒险,科幻;应该出现“星球大战”,“指环王”和“黑客帝国”。
选择我使用过的一场比赛:
var match = ko.utils.arrayFirst(genreValues,
function (genre) {
return self.filterValues.indexOf(genre.trim()) > -1;});
if (match) {
return match;
}
但是为了显示我使用的所有匹配结果:
var matches = ko.utils.arrayFilter(genreValues, function (genre) { return
self.filterValues.indexOf(genre.trim()) >= 0; });
return matches.length === self.filterValues().length;
也许有一种方法可以将它们结合起来?这是我的小提琴尝试: https://jsfiddle.net/0jr5Lc25/
答案 0 :(得分:2)
self.filterProducts = ko.computed(function () {
return ko.utils.arrayFilter(self.products(),function (product) {
var genreValues = product.genre.split(",");
var mediaValues = product.media;
var genreMatch = false;
var mediaMatch = false;
ko.utils.arrayForEach(genreValues, function (genre) {
if( self.filterValues.indexOf(genre.trim()) >= 0){
genreMatch = true;
}
//return self.filterValues.indexOf(genre.trim()) >= 0;
});
if(self.filterMedia().length === 0){
mediaMatch = true;
}
if(self.filterValues().length === 0){
genreMatch = true
}
// if string
if(self.filterMedia().indexOf(mediaValues.trim()) >= 0){
mediaMatch = true;
}
// if array
//ko.utils.arrayForEach(mediaValues, function (media) {
//if(self.filterMedia().indexOf(media.trim()) >= 0){
//mediaMatch = true;
//}
//});
if(genreMatch && mediaMatch){
return true;
} return false;
});
});
你有一些问题;
ko.utils.arrayFilter只需要使用一次。
var mediamatches = ko.utils.arrayFilter(mediaValues ...正在与需要为mediaValues的self.filterValues进行比较。
BlueRay并不等于BluRay
Sci-Fi html复选框正在修正html。