我有一个称为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]);
}
}
});
答案 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)
诀窍是遍历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);