我使用函数根据年份键的值过滤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而不是库。
答案 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'
});