按两个不同的值过滤JSON

时间:2015-09-19 03:40:33

标签: javascript json

我使用函数根据年份键的值过滤JSON文件,如下所示:

function filterYr(json, key, value) {
  var result = [];
  for (var year in json) {
    if (json[year][key] === value) {
      result.push(json[year]);
    }
  }

  return result;
}

我然后设置默认值:

var chooseYear = filterYr(json, 'year', "2000");

但是还有一个下拉列表,因此可以在下拉选择选项的更改时过滤JSON文件。

我的问题是,我可以使用同样的功能来过滤同一个JSON文件吗?

例如,我也希望按键'类型进行过滤。' 如果它是一个新功能,那就是:

function filterType(json, key, value) {
  var result = [];
  for (var type in json) {
    if (json[type][key] === value) {
      result.push(json[type]);
    }
  }

  return result;
}

但是我如何将它组合成一个功能呢? 然后我如何设置一个默认值,通过'类型'和'#年;功能? 这可能吗?

感谢您,如果我不清楚,是否可以提供更多详细信息,请告诉我。

PS-如果可能的话,我更喜欢使用javascript而不是库。

2 个答案:

答案 0 :(得分:2)

如果您的数据结构如下所示,那么您当前的功能就可以正常运行

var items = [
  {
      year: 2000,
      type: 'type1'
  },
  {
      year: 2001,
      type: 'type2'
  }
];

function filterYr(json, key, value) {
  var result = [];
  for (var year in json) {
    if (json[year][key] === value) {
        result.push(json[year]);
    }
  }
  return result;
}

filterYr(items, 'type', 'type2'); //[ { year: 2001, type: 'type2' } ]
filterYr(items, 'year', 2000); //[ { year: 2000, type: 'type1' } ]

您只需要为函数和年变量使用更通用的名称

答案 1 :(得分:1)

您可以修改该功能,使其接受一个对象作为过滤条件。以下函数接受具有n个属性的对象:

function findWhere(collection, props) {
    var keys = Object.keys(props), // get the object's keys 
        klen = keys.length; // cache the length of returned array

    return collection.filter(function(el) {
        // compare the length of the matching properties
        // against the length of the passed parameters
        // if both are equal, return true
        return keys.filter(function(key) {
            return el[key] === props[key];
        }).length === klen;
    })
}

var filteredCollection = findWhere(arrayOfObjects, { 
   type: 'foo', 
   anotherProp: 'aValue' 
});