#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>