2016-11-16 23 views
0

我试图写的滤波器函数,接受2个参数: ID类型和实际的ID。使用这些ID,我想过滤一个对象数组。

例如,在这里我试图获得一个只包含名称为'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); 

很难说什么是好,但我个人更喜欢第二种方法。