所以我要从mongoDB数据库中导入以下内容,在正在构建的node.js应用程序上,我要发布的块部分都在异步函数中,我将尝试发布一个控制台记录我正在使用的每个对象,看看是否有人可以向我解释这一点,但是基本上我有2个数组迭代,它们构建了一个对象以对象数组的形式发送到前端,但是代码会发送与我的迭代匹配的第一个对象,然后返回一个空白对象,这意味着如果我尝试向期望的输出中添加多个对象,它将仅返回该表达式的第一个元素之一找到并且它不检查其余部分。
在此先感谢任何可以帮助我的人!
我正在使用的对象:
const about = await About.find(); //always has one document only so no conflict here
const allSkills = await Skill.find(); //grabs all the skills in the database
const skills = about[0].skillBag.filter((name) => name); //selects all the skills the user saved
控制台日志:
console.log(allSkills) -> [
{
_id: 5fa59424f3d6532ae63fad26,
category: 'Web Development',
name: 'wordpress',
path: 'wordpress.svg',
__v: 0
},
{
_id: 5fa5979c9e84032b92d3e9ee,
category: 'DevOps',
name: 'nginx',
path: 'nginx.svg',
__v: 0
},
{
_id: 5fa597b79e84032b92d3e9ef,
category: 'Web Development',
name: 'javascript',
path: 'javascript.svg',
__v: 0
},
.
.
.
]
console.log(skills) -> ["javascript","nginx"]
由于我已经尝试调试了一段时间,现在我甚至构建了多个表达式来尝试一次迭代一个数组:
//This lists all the skills with the category 'DevOps'
//and builds an object from them with the output {name: 'nginx', path: 'nginx.svg'}
const allDevOpsSkills = allSkills
.filter((e) => e.category == "DevOps")
.map((n) => ({ name: n.name, path: n.path }));
// Does the same for the category 'Web Development'
const allWebDevSkills = allSkills
.filter((e) => e.category == "Web Development")
.map((n) => ({ name: n.name, path: n.path }));
这2个表达式始终返回具有对象 .map()构建的数组 然后,我抓住这两个表达式并执行:
const userDevOpsSkills = allDevOpsSkills.filter((n, i) => n.name == `${skills[i]}`);
// returns [ { name: 'nginx', path: 'nginx.svg' } ]
const userWebDevSkills = allWebDevSkills.filter((n, i) => n.name == `${skills[i]}`);
// returns [] and not [ { name: 'javascript', path: 'javascript.svg' } ]
我知道我可以在一个表达式中而不是2中执行此操作,这是表达式的最终版本,但是,如果我像上面的示例一样执行代码,或者如果像下面的示例那样运行代码,则输出总是相同的< / p>
//Same expressions as above but in a more short way
const userWebDevSkills = allSkills
.filter((e) => e.category == "Web Development")
.map((n) => ({ name: n.name, path: n.path }))
.filter((n, i) => n.name == `${skills[i]}`);
const userDevOpsSkills = allSkills
.filter((e) => e.category == "DevOps")
.map((n) => ({ name: n.name, path: n.path }))
.filter((n, i) => n.name == `${skills[i]}`);
其他信息:
-我在第一个代码块上的当前技能常量返回的参数都存储在数据库中,但是为了使该帖子不再被我修改,我想执行多次检查同一数组。
很抱歉,如果我不能更好地解释自己,英语不是我的母语,并且我没编码这么长时间就了解这里到底出了什么问题。
在此先感谢能为我提供帮助的任何人!
编辑 波纹管是没有被分成单独的代码块的代码
const express = require("express");
const About = require("../models/aboutSchema");
const Skill = require("../models/skillSchema");
const { logger } = require("../controllers/logs");
const router = express.Router();
router.get("/", async (req, res) => {
try {
const path = req.originalUrl;
const about = await About.find();
const allSkills = await Skill.find();
const skills = about[0].skillBag.filter((name) => name);
const userWebDevSkills = allSkills
.filter((e) => e.category == "Web Development")
.map((n) => ({ name: n.name, path: n.path }))
.filter((n, i) => n.name == `${skills[i]}`);
const userDevOpsSkills = allSkills
.filter((e) => e.category == "DevOps")
.map((n) => ({ name: n.name, path: n.path }))
.filter((n, i) => n.name == `${skills[i]}`);
console.log(userWebDevSkills);
res.status(200).render("home.ejs", {
title: "Homepage | FilipeDev",
user: req.user,
path,
about: about[0],
webDev: userWebDevSkills,
devOps: userDevOpsSkills,
});
} catch (e) {
console.log(e);
logger.error(e);
}
});
module.exports = router;
答案 0 :(得分:0)
如果我理解您的问题,那么您会期望:
ActionResult
给你
const userWebDevSkills = allWebDevSkills.filter((n, i) => n.name == `${skills[i]}`);
当我运行此代码时:
[ { name: 'javascript', path: 'javascript.svg' } ]
的确,我确实为userWebDevSkills获得了一个空数组,问题是const skills = ["javascript", "nginx"];
const allSkills = [{
_id: 'fa59424f3d6532ae63fad26',
category: 'Web Development',
name: 'wordpress',
path: 'wordpress.svg',
__v: 0
},
{
_id: 'fa5979c9e84032b92d3e9ee',
category: 'DevOps',
name: 'nginx',
path: 'nginx.svg',
__v: 0
},
{
_id: 'fa597b79e84032b92d3e9ef',
category: 'Web Development',
name: 'javascript',
path: 'javascript.svg',
__v: 0
},
];
const allDevOpsSkills = allSkills
.filter((e) => e.category == "DevOps")
.map((n) => ({ name: n.name, path: n.path }));
const allWebDevSkills = allSkills
.filter((e) => e.category == "Web Development")
.map((n) => ({ name: n.name, path: n.path }));
const userWebDevSkills = allWebDevSkills.filter((n, i) => n.name == `${skills[i]}`);
最终是这样的:
allWebDevSkills
而且,如果[
{ name: 'wordpress', path: 'wordpress.svg' },
{ name: 'javascript', path: 'javascript.svg' }
]
是这样的:
skills
然后,这种情况:
["javascript","nginx"]
永远都不是真实的,因此您永远不会保留n.name == `${skills[i]}`
操作中的任何项目,因此最终会得到一个空数组。我不知道您到底打算怎么做
allWebDevSkills.filter()
进行比较,所以我不确定要解决的确切建议,但这要求n.name == `${skills[i]}`
属性在allWebDevSkills
和skills
之间的数组匹配中具有确切位置那不会发生。 .name
名称属性位于javascript
的位置1,但对于allWebDevSkills
数组位于0
的位置,因此将永远不符合您的过滤条件。
此外,这样的代码:
skills
可以是这样:
n.name == `${skills[i]}`
无需单独将单个字符串放入 n.name === skills[i]
模板中,并且在比较字符串(并且不希望启用类型转换)时倾向于使用${}
。
如果您要使用===
进行的操作是删除没有.filter()
数组中任何具有.name
属性的项目,那么我会建议这个:
skills