array.filter by object属性,未定义参数

时间:2016-11-16 15:01:25

标签: javascript

我正在尝试编写一个带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')));

未定义返回名称。

我是否也需要传入实际的数组?是否可以将参数传递给过滤函数?

2 个答案:

答案 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);

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