2015-09-19 2 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

Вы можете изменить функцию, чтобы она принимала объект в качестве критерия фильтрации. Следующая функция принимает объект с п рядом свойств:

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' 
}); 
Смежные вопросы