массив Lodash _includes

#javascript #arrays #lodash

#javascript #массивы #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

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

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

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

Спасибо!

Комментарии:

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

2. Спасибо, отлично работает!

Ответ №1:

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

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

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

Ответ №2:

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

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

Ответ №3:

Внутри функции область действия отличается, что означает, что this относится к чему-то другому (большая часть window объекта case), поэтому вы не можете получить доступ 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));
  

Ответ №4:

Ваша проблема заключается в доступе this к обратному вызову, который вызывается в другом контексте. Вы можете использовать функции со стрелками или bind для ее решения.

Однако, вместо решения 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>