我正在尝试编写一个带2个参数的过滤函数:
ID类型和实际的 ID值。使用这些ID,我想过滤一组对象。
例如,我在这里尝试获取一个只包含名称为'Mike'
的值的新数组。
对象:
var sample = [
{ name: 'Mike'},
{ name: 'John'}
];
过滤功能:
function filterById(obj, parameter, id) {
return obj.parameter == id;
}
这样:
console.log(sample.filter(filterById(name, 'Mike')));
未定义返回名称。
我是否也需要传入实际的数组?是否可以将参数传递给过滤函数?
答案 0 :(得分:6)
您还需要将“参数”作为字符串传递,并使用方括号表示法,为此全部工作,您的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 :(得分: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);
很难说什么更好,但我个人更喜欢第二种方法。