2015-09-19 81 views
1

我使用的功能基礎上,今年鍵的值篩選一個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

如果你的數據結構如下圖所示,您目前的功能只是效果很好

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

您可以修改該函數,以便它接受一個對象作爲篩選條件。下面的函數接受與性能的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' 
});