lodash Array _includes - PullRequest
       2

lodash Array _includes

2 голосов
/ 01 апреля 2019

Как передать массив в 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

, однако, если я делаю что-то подобное.testuser = ['aaa', 'bbb'];

this.selection = _.filter(users, function(p) {
           return _.includes(this.testuser, p.name);           
        });

жалуется на this.testuser?

Спасибо!

Ответы [ 4 ]

0 голосов
/ 01 апреля 2019

Ваша проблема - доступ к 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>
0 голосов
/ 01 апреля 2019

Здесь this внутри функции будет связываться с анонимной функцией, которая не имеет переменной testuser.Таким образом, вы можете использовать arrow function, как указано в комментарии, или bind

this.selection = _.filter(users,
    (function(p) {
        return _.includes(this.testuser, p.name);           
    }).bind(this));
0 голосов
/ 01 апреля 2019

Как отметили @ Pranav C Balan в своем комментарии, ключевое слово this связывается с функцией, которую вы передаете _.includes().Если вы предоставите функцию со стрелкой, например, она будет привязана к вашему классу:

this.selection = _.filter(users, (p) => { return _.includes(this.testuser, p.name); });

Другая альтернатива - использовать Function.prototype.bind(), как указано @ brk

0 голосов
/ 01 апреля 2019

Внутри функции область видимости отличается, значит this относится к чему-то другому (в большинстве случаев window объект), поэтому вы не можете получить доступ к this.testuser внутри функции, поскольку она определена в другом объеме.

Чтобы заставить его работать, используйте функцию стрелки (которая не имеет своих привязок к this) вместо традиционной функции синтаксис.

this.selection = _.filter(users, p => _.includes(this.testuser, p.name));

Вы можете сделать это, используя встроенные функции Javascript и без необходимости в lodash.

this.selection = users.filter(p => this.testuser.includes(p.name));
...