Лучше всего применить однонаправленный поток данных.
То есть. Хранить в постоянной памяти только исходный набор данных в виде списка объектов:
var items = [
{
color: 'red',
size: 100
},
{
color: 'blue',
size: 70
}
// и так далее
]
Затем, когда пользователь выбрал какой-нибудь фильтр, например, цвет красный, пройтись по списку
items
и собрать те значения фильтра "размер", которые встречаются в элементах, которые подходят под фильтр цвета:
var color = 'red';
var availableSizes = []; // Будет содержать список доступных размеров для красного цвета
items
// Отсеиваем элементы по фильтру цвета
.filter( function( item ) { return item.color === color; })
// Собираем значения фильтра размера для них
.forEach( function( item ) {
if ( availableSizes.indexOf( item.size ) === -1 )
availableSizes.indexOf.push( item.size );
});
Полученный список размеров нужно передать в селектор на представлении и забыть его. Если пользователь выбрал другой цвет, то нужно взять начальный массив
items
и заново проделать с ним операцию, описанную выше. Не надо сохранять и использовать результат предыдущего запроса, надо работать только с начальным набором данных и тем, что ввёл пользователь, иначе сложность программы будет расти быстрее грибов после дождя.