根据另一个对象中可用的数据过滤对象

时间:2018-02-13 04:16:51

标签: javascript arrays filter

我正在努力过滤一系列合作伙伴。仅仅为了简单起见,我正在定义合作伙伴对象,如下所示:

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

0 个答案:

没有答案