lodash数组_includes

时间:2019-04-01 17:38:18

标签: javascript arrays lodash

如何在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?

谢谢!

4 个答案:

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