2015-07-01 3 views
1

У меня есть функция Angular, и я пытаюсь вернуть отфильтрованный набор данных, используя метод Javascript Array.prototype.filter(). Я сопоставляю несколько объектов ввода keyvalue пары с другим набором пар объектов keyvalue и возвращает объект, если они совпадают.Угловой сервисный фильтр Subtractive

Вот моя служба:

app.service('scatterService', function(inputService) { 
    return function(data) { 
     var inputs = inputService.selectedInModel(); // returns 1 - 4 user input objects 
     function getSelected(inputs) { 
      return data.filter(function(obj) { 
       // for each user input that exists 
       angular.forEach(inputs, function(val, id) { 
        var dataProp = val['inData']; 
        // if prop value in data = prop value in user input 
        if (obj[dataProp] == val['value']) { 
         // returns objects that have *either* of the user inputs 
         return true; 
        } 
        return false; 
       }); 
      }); 
     } 
     var newData = getSelected(inputs); 
     console.log(newData); 
    }; 
}); 

Это возвращает набор объектов, которые содержат свойства либо с value «а» или value «б», но один из двух. Я хочу, чтобы это возвращало только объекты с значениями a и b. Таким образом, если имеется четыре теоретических пользовательских ввода, каждый выбранный пользователем пользователь сжимает данные все больше и больше. Или верните только те элементы, которые имеют все входные значения.

Я также хочу, чтобы это позволило функционально фильтровать до 4 потенциальных входов.

Edit: Добавление Структура объекта

inputs: { 
    'entertainment': { 
     id: 'entertainment', 
     inData: 'Ent', 
     value: '', 
    }, 
    'TV': { 
     id: 'TV', 
     inData: 'tv', 
     value: '17' 
    }, 
    'Radio': { 
     id: 'radio', 
     inData: 'radio', 
     value: 'JackFM' 
    } 
}, 

данные: 300+ элементы

data = [ 
    { 
     id: '12345', 
     Ent: 30, 
     tv: 33 
    }, 
    { 
     id: 'TV', 
     tv: 17, 
     Ent: 999 
    } 
    // ... and so on 
] 
+0

Я думаю, что это может помочь, чтобы увидеть пример того, что '' data' и inputs' может выглядеть – kaveman

+0

Конечно, я сделаю это изменить. – Himmel

+0

Добавлены объекты ввода и сопоставления – Himmel

ответ

1

Фокусирование на вашем Array.prototype.filter разделе:

return data.filter(function(obj) { 
    // for each user input that exists 
    angular.forEach(inputs, function(val, id) { 
     var dataProp = val['inData']; 
     // if prop value in data = prop value in user input 
     if (obj[dataProp] == val['value']) { 
      // returns objects that have *either* of the user inputs 
      return true; 
     } 
     return false; 
    }); 
}); 

Вы немедленно вернуться ing true, когда вы найдете соответствующее значение свойства - что приводит к тому, что obj будет выбран фильтром, если любой из значений соответствует.

Вместо этого вы можете создать результат, используя оператор boolean AND по каждому из входов. Результат будет true тогда и только тогда, когда каждый из промежуточных тестов ввода был true. Если какой-либо провал, результат будет false.

return data.filter(function(obj) { 
    // result tracks if this is a matching obj 
    // initially assume that it is 
    var result = true; 

    // for each user input that exists 
    angular.forEach(inputs, function(val, id) { 
     var dataProp = val['inData']; 
     // AND the current result value with this input's test 
     result = result && obj[dataProp] === val['value']; 
    }); 

    // return the resulting chain of ANDs 
    return result; 
}); 
+0

Не будет ли «результат» отслеживать только совпадение предыдущего значения, а не то, были ли они раньше этого? – Himmel

+1

Я не уверен, что понимаю этот вопрос? 'result' сбрасывается каждый раз, когда мы смотрим на новый' obj' - для каждого элемента в 'data' - и' result' всегда смотрит только на один 'obj' за раз. – kaveman

+0

Извините, мне потребовалось немного понять, что вы здесь делаете с цепочкой '&&'. Это отличный ответ и решает мою проблему. Хорошо продумано и объяснено. – Himmel

Смежные вопросы