数组中.按对象属性筛选,参数未定义

array.filter by object property, argument is not defined

本文关键字:参数 未定义 筛选 属性 对象 数组      更新时间:2023-09-26

我想写一个过滤器函数,需要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')));

返回未定义的名称。

我还需要传递实际的数组吗?是否有可能将参数传递到过滤函数中?

您需要将"parameter"作为字符串传递,并使用方括号符号,并且为了这一切都工作,您的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')));

您不必自己调用该函数—它是一个高阶函数,因此您必须只提供函数。问题来了——你想在那里传递参数,但是你不能!

所以,方法很少。第一个只是返回另一个函数,它将数据保存在闭包中:

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

第二个选项是通过.bind创建另一个函数,这与部分应用程序的思想很接近。它将创建具有预定义参数的新函数。它们总是在最前面,所以你必须把实际的项定义移到最后一个位置:

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

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