У меня есть массив сообщений, который является тестовым вызовом, а следующий код принимает другой массив и нажимает сообщение, если имя равно чем-то:
var test = [];
docs = [{name: 'mateo',lastName: 'mateo'},
{name: 'Jhon',lastName: 'smith'}}]
docs.forEach(function(item) {
if(item.name === 'mateo'){
test.push(item);
}
});
Я хочу использовать разные параметры для имени, но я не знаю, как, я пытался использовать что-то вроде этого, но он не работал:
var test = [];
docs = [{name: 'mateo', lastName: 'mateo'},
{name: 'Jhon',lastName: 'smith'}}]
const varNames = ['name','lastName'];
docs.forEach(function(item) {
for(i = 0; i < varNames.length; i++){
if(item.[varNames[i]] === 'mateo'){
test.push(item);
console.log(varNames[i]);
}
}
});
Всего 3 ответа
Это не так. + Изменить
if(item.["varNames[i]"] === 'mateo') {
Для того, чтобы:
if(item[varNames[i]] === 'mateo') {
Кстати, вы должны разбить цикл после согласования элемента:
if(item[varNames[i]] === 'mateo') {
test.push(item);
break;
}
Вы также можете заменить это целое for
цикл с помощью другой функции массива, называемой some
, чтобы весь ваш код выглядел так:
docs.forEach(function(item) {
var check = varNames.some(function(varName) {
return item[varName] === 'mateo'
});
if(check) {
test.push(item);
}
})
Который может быть короче, если вы используете функцию стрелки:
docs.forEach(item => {
if(varNames.some(varName => item[varName] === 'mateo')) {
test.push(item);
}
})
Вы действительно должны использовать filter()
для этого, все будет проще:
let docs = [ {name: 'mateo', lastName: 'johnson'}, {name: 'Jhon',lastName: 'smith'}, {name: 'Mark',lastName: 'mateo'} ] var test = docs.filter(item =>item.name === "mateo") console.log(test)
Затем, чтобы проверить массив имен, вы можете просто использовать some()
чтобы узнать, соответствуют ли некоторые свойства:
let docs = [ {name: 'mateo', lastName: 'johnson'}, {name: 'Jhon',lastName: 'smith'}, {name: 'Mark',lastName: 'mateo'} ] const varNames = ['name','lastName']; var test = docs.filter(item => varNames.some(name => item[name] == 'mateo')) console.log(test)
Фокус в том, чтобы перебирать как varNames
и docs
. Вы знакомы с .forEach
, поэтому этот пример использует его, хотя это может быть лучшим вариантом для .filter
.
const test = []; const varNames = ['name', 'otherName']; const docs = [ { name: 'mateo' }, { name: 'name' }, { name: 'otherName' } ]; varNames.forEach(varName => { docs.forEach(doc => { if (doc.name === varName) test.push(doc); }); }); console.log(test);