2016-11-16 2 views
0

Я пытаюсь написать функцию фильтра, которая принимает 2 параметра: типаидентификатор и значение идентификатор фактического . Используя эти идентификаторы, я хочу отфильтровать массив объектов.

Например, здесь я пытаюсь получить новый массив, который включает только значения с именем 'Mike'.
Array.filter на свойства объекта, аргумент не определен

объекта: функция

var sample = [ 
{ name: 'Mike'}, 
{ name: 'John'} 
]; 

фильтр:

function filterById(obj, parameter, id) { 
    return obj.parameter == id; 
} 

это:

console.log(sample.filter(filterById(name, 'Mike'))); 

имя возвращается не определен.

Нужно ли передавать и фактический массив? Можно ли вообще передавать параметры в функции фильтрации?

ответ

5

Вам нужно будет пройти «параметр» в виде строки тоже, и использовать квадратные скобки, обозначение, а для этого все, чтобы работать ваша filterById функция будет сама придется возвращать функцию, которая соответствует функции, используемой Array.prototype.filter :

var sample = [ 
 
    { name: 'Mike'}, 
 
    { name: 'John'} 
 
]; 
 

 
function filterById(parameter, id) { 
 
    return function(obj){ 
 
    return obj[parameter] == id; 
 
    } 
 
} 
 

 
console.log(sample.filter(filterById('name', 'Mike')));

1

вы не должны вызывать функцию самостоятельно - это high-order function, так что вы должны обеспечить только функцию. И здесь мы приходим к проблеме - вы хотите передать там аргументы, но вы не можете!

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

function filterById(parameter, id) { 
    return function(item) { 
     return item[parameter] == id; 
    } 
} 

второй вариант заключается в создании другой функции через .bind, которая близка к идее partial application. Он создаст новую функцию с заранее определенными параметрами. Они всегда первые, так что вы должны переместить фактическое определение элемента к последней позиции:

function filterById(parameter, id, item) { 
    return item[parameter] === id; 
} 

// we can create function for the future reference: 
const filterByMike = filterById.bind(null, 'name', 'Mike'); 

sample.filter(filterByMike); 

Трудно сказать, что лучше, но я лично предпочитаю второй подход.

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