Как использовать строку в качестве объекта с различными параметрами в javascript?

У меня есть массив сообщений, который является тестовым вызовом, а следующий код принимает другой массив и нажимает сообщение, если имя равно чем-то:

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 ответа

Автоматический диспенсер мыльной пены от xiaomi.


Это не так. + Изменить

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); 


Есть идеи?

10000