如何在JavaScript中将字符串用作具有不同参数的对象?

时间:2018-10-14 23:19:03

标签: javascript arrays

我有一个称为test的帖子数组,下一个代码采用其他数组并在名称相等的情况下推送帖子:

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 个答案:

答案 0 :(得分: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);
    }
})

答案 1 :(得分:2)

为此,您确实应该使用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)

答案 2 :(得分:0)

诀窍是遍历varNamesdocs。您对.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);