Javascript:数组迭代适用于第二个表达式,但不适用于第一个表达式

时间:2020-11-07 20:45:57

标签: javascript node.js arrays

所以我要从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;

1 个答案:

答案 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]}` 属性在allWebDevSkillsskills之间的数组匹配中具有确切位置那不会发生。 .name名称属性位于javascript的位置1,但对于allWebDevSkills数组位于0的位置,因此将永远不符合您的过滤条件。


此外,这样的代码:

skills

可以是这样:

 n.name == `${skills[i]}`

无需单独将单个字符串放入 n.name === skills[i] 模板中,并且在比较字符串(并且不希望启用类型转换)时倾向于使用${}


如果您要使用===进行的操作是删除没有.filter()数组中任何具有.name属性的项目,那么我会建议这个:

skills

相关问题