使用字典过滤javascript数据对象

时间:2018-08-02 22:28:05

标签: javascript dictionary filter

说我有一个过滤器:

filter = [ {key: "pl", value: 3}, {key: "sh", value: 2} ]

我想使用上述过滤条件过滤以下javascript对象:

var data = [
{title: "The Uncertainty of the Poet ",
pl: 3,
si: 2,
va: 3,
te: 0,
co: 0,
or: 4,
sh: 2,
po: 0,
li: 0,
ar: 5
},
{
title: "Direction",
pl: 4,
si: 3,
va: 1,
te: 3,
co: 0,
or: 3,
sh: 2,
po: 0,
li: 0,
ar: 5
}
...
]

我没有运气就尝试了以下方法:

var result = data.filter(function(d){
            for (item in filter) {
                return d.key==d.value;
            }

4 个答案:

答案 0 :(得分:1)

检查对象是否符合所有条件的另一个可能选择:

data.filter(function(obj) {
    return filter.reduce(function(a, f) {
        return a && (obj[f.key] === f.value);
    }, true);
});

由于使用了reduce,因此无需检查hasOwnProperty就可以工作。如果要检查是否有任何过滤条件成立,则可以将其更改为

data.filter(function(obj) {
    return filter.reduce(function(a, f) {
        return a || (obj[f.key] === f.value);
    }, false);
});

答案 1 :(得分:0)

您对[{ "id":"1", "subject_id":"2", "questionaire_id":"1", "name":"Quiz 1", "description":"Answer this quiz within 1 hour", "start":"7:30AM", "end":"8:30AM", "date":"08-01-18", "questionaire_name":"Right triangle", "questionaire_description":"Questionaire # 1" }] 的了解不够深。它正在遍历数组,并且无法处理数组中的每个对象

可以使用Array#every()来确保过滤器数组中的每个对象在数据对象中都匹配

for in
// filter main data
var result = data.filter(function(dataObj){
   // check if all proprties within filter array are a match
   return filter.every(function(filterObj){
      //compare value of property found in filterObject with value 
      return dataObj[filterObj.key] === filterObj.value
   })
})

console.log(result)

答案 2 :(得分:0)

如果您希望它匹配一个或另一个值,这将起作用:

match = [ {key: "pl", value: 3}, {key: "sh", value: 2} ]

var result = data.filter(function(d) {
    return d.pl === match[0]['value'] || d.sh === match[1]['value']
})

为避免混淆,我将数组的名称更改为match

答案 3 :(得分:0)

您也可以这样做:

var filters = [{key: "pl", value: 3}, {key: "sh", value: 2}]

var data = [
    {
        title: "The Uncertainty of the Poet ",
        pl: 2,
        si: 2,
        va: 3,
        te: 0,
        co: 0,
        or: 4,
        sh: 3,
        po: 0,
        li: 0,
        ar: 5
    },
    {
        title: "Direction",
        pl: 3,
        si: 3,
        va: 1,
        te: 3,
        co: 0,
        or: 3,
        sh: 2,
        po: 0,
        li: 0,
        ar: 5
    }
]

var result = data.filter((item) => {
  for(let i = 0; i < filters.length; ++i) {
    let filter = filters[i];

    if(item[filter.key] && item[filter.key] === filter.value) {
      return true;
    }
  }

  return false;
});