我正在努力过滤一系列合作伙伴。仅仅为了简单起见,我正在定义合作伙伴对象,如下所示:
var partners = [
{ partnerCategory: "Gold", programs: ["Enterprise"] },
{ partnerCategory: "Silver", programs: ["Core", "Enterprise"] },
{ partnerCategory: "Silver", programs: ["Enterprise"] }
];
现在有2个选项列表:partnerCategory和程序。如果用户从选项列表中选择任何值,那么我将填充对象filterCriteria。
现在我以各种方式定义filterCriteria,以了解应该返回的记录。
选项1
var filterCriteria = [
{ fieldName: "partnerCategory", fieldValue: ["Silver"] }
];
应该返回第2和第3条记录。
选项2
var filterCriteria = [
{ fieldName: "partnerCategory", fieldValue: ["Silver", "Gold"] }
];
不应该返回任何记录
选项3
var filterCriteria = [
{ fieldName: "partnerCategory", fieldValue: ["Silver"] },
{ fieldName: "programs", fieldValue: ["Enterprise"] }
];
应该返回第2和第3条记录。
选项4
var filterCriteria = [
{ fieldName: "partnerCategory", fieldValue: ["Silver"] },
{ fieldName: "programs", fieldValue: ["Enterprise", "Core"] }
];
只应返回第2条记录。
所以基本上如果filterCriteria对象中存在一个值,那么记录应该包含过滤器中的所有值。
我使用下面的代码来获取输出,但我遗漏了一些东西:
var result = partners.filter(function (obj) {
return filterCriteria.every(function (c) {
var value = obj[c.fieldName];
if (typeof value === 'object') {
return Object.keys(value).every(function (key) {
return c.fieldValue.indexOf(value[key]) > -1
})
}
else
return c.fieldValue.indexOf(value) > -1
})
});
编辑:现在我正在使用此代码,但选项2和4未提供所需的输出:
var result = partners.filter(function (partner) {
return filterCriteria.every(function (c) {
var value = partner[c.fieldName];
console.log(value);
if (typeof value === 'object') {
return c.fieldValue.length==value.length &&
c.fieldValue.every(function(v,i){return v==value[i];});
}
else
return c.fieldValue.indexOf(value) > -1;
})
})