数组中.按对象属性筛选,参数未定义
array.filter by object property, argument is not defined
我想写一个过滤器函数,需要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);
很难说哪种方法更好,但我个人更喜欢第二种方法。
相关文章:
- 要求未定义JS回调参数
- 为什么grunt contrib connect的中间件选项的第三个参数是未定义的
- 角度指令控制器:参数不是函数,未定义
- AngularJS-参数'菜单Ctrl'不是函数,未定义
- JS和Jquery函数参数未定义
- 为什么我传递给函数的参数未定义
- Javascript-函数获取数组元素参数未定义/为null
- 使用原型向函数添加属性会导致函数参数未定义
- 传递给闭包的角度参数未定义
- 骨干路由器多参数;第二个参数未定义
- Express.js请求参数未定义
- 数组中.按对象属性筛选,参数未定义
- jQuery和javascript表单验证:密码字段参数未定义,密码确认ok
- JQuery高亮插件,参数未定义
- Express JS:参数未定义
- 函数参数未定义
- Javascript:参数未定义
- 使用$stateParams, UI-router从URL获取参数.未定义的值
- ng-table's getData函数中参数未定义
- 获取“参数未定义”;在jQuery与AJAX, MySQL和PHP