如何在lodash中传递数组?
users = [{
name: 'aaa', age: 22
},{
name: 'bbb', age: 33
},{
name: 'ccc', age: 44
},];
this.selection = _.filter(users, function(p) {
return _.includes(['aaa', 'bbb'], p.name);
});
上面的代码工作正常,我获得了用户aaa和bbb的所有详细信息
但是,如果我做类似的事情 this.testuser = ['aaa','bbb'];
this.selection = _.filter(users, function(p) {
return _.includes(this.testuser, p.name);
});
它抱怨this.testuser?
谢谢!
答案 0 :(得分:0)
在function中,范围是不同的,意味着this
引用了其他内容(大多数情况下是window
对象),因此您无法在函数内部访问this.testuser
因为它是在不同的范围内定义的。
使用arrow function(没有自己绑定到this
的语法)来代替traditional function语法。
this.selection = _.filter(users, p => _.includes(this.testuser, p.name));
您可以使用本机Javascript函数完成此操作,而无需lodash。
this.selection = users.filter(p => this.testuser.includes(p.name));
答案 1 :(得分:0)
此函数内的this
将绑定到没有testuser
变量的匿名函数。因此,您可以按照评论中的说明使用arrow function
,也可以使用bind
this.selection = _.filter(users,
(function(p) {
return _.includes(this.testuser, p.name);
}).bind(this));
答案 2 :(得分:0)
正如 @Pranav C Balan 在其评论中指出的那样,关键字this
绑定到您要传递给_.includes()
的函数上。如果像这样提供箭头功能,它将绑定到您的类:
this.selection = _.filter(users, (p) => { return _.includes(this.testuser, p.name); });
另一种替代方法是使用Function.prototype.bind()
,如 @brk
答案 3 :(得分:0)
您的问题是在不同上下文中调用的回调内部访问this
。您可以使用箭头功能或通过绑定来解决它。
但是,除了解决this
问题之外,您还可以使用lodash的_.intersectionWith()
通过使用另一个数组中的值来解决从一个数组中选择项目的问题。由于您没有在回调函数中使用this.testuser
,因此不会遇到同样的问题。
var users = [{"name":"aaa","age":22},{"name":"bbb","age":33},{"name":"ccc","age":44}];
var obj = {
testuser: ['aaa', 'bbb'],
selection(users) {
return _.intersectionWith(users, this.testuser, function(a, b) {
return a.name === b;
});
}
};
console.log(obj.selection(users));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>