【问题标题】:Suggestions to concise this code snippet?建议精简此代码段?
【发布时间】:2019-12-02 01:27:08
【问题描述】:

当 request.params.name 字段通过请求进入时,我希望对象的 .name 值与 pic: 一起呈现,这样我们就可以用正确的图片呈现网页。

我尝试过切片来获取 person.bros.whateverthenameis,但是当 json 对象被传递给 express 的渲染方法时,它无法正确读取。因此,与其传递 willis_pic、Llama_pic、Carter_pic(它们只是 person.burns.whateverthenameis)等 id,不如传递 person.burns.(req.params.name) 但它不能正常工作,因为 req.params.name是一个字符串,不被识别为我想要的点符号。为了清楚起见,我想以更简洁的方式将 person.burns.Willis 或 person.burns.Llama 等传递到 render 方法的 pic:param 中,因为所有这些 if 语句都是废话。我也使用了 json parse 和 stringify,当我尝试将它们记录到控制台时,它们都不起作用并且输出未定义。

router.get("/profile/:name", mid.requiresLogin, function(req,res,next) {

    var persons = {
        bros: {
            Willis: src = 'https://www.coloradocollege.edu/academics/dept/filmandnewmedia/images/Students/2018-19/Major%20Photo%20Border_WillisZetter_2019.jpg',
            Llama: src = 'https://media.licdn.com/dms/image/C5603AQFQwEfmSpR1bQ/profile-displayphoto-shrink_200_200/0?e=1568851200&v=beta&t=lX01L9YxKGJmgkGT0FwQdN1o2-oNyxA18c42q_IPcfU',
            Carter: src = 'https://cctigers.com/images/2019/2/8/Richardson2019.jpg',
            Quang: src='https://media.licdn.com/dms/image/C5103AQE3RFIlv9FMEw/profile-displayphoto-shrink_800_800/0?e=1568851200&v=beta&t=yL9fgzubo7_XZpgmbFVRwDYUYULiGVPAf091qzq5Rm8',
            Maslow: src='https://media.licdn.com/dms/image/C4E03AQHHMv2-Fo0ppg/profile-displayphoto-shrink_800_800/0?e=1568851200&v=beta&t=5KYt7vrP-iXkgy0s2eDtLvDgnge0IF2DoSELDOnm4Gg',
                Beem: src='https://media.licdn.com/dms/image/C5603AQG1_8PHv_WGoQ/profile-displayphoto-shrink_800_800/0?e=1568851200&v=beta&t=NnVjW5UjQeXG8e0QwhsKe4XvFcU8JUbgHd7d5TRSww8'

        }
    };
    //if the obj.name is === (Any of the names that are pic variables) render that persons prof
    User.findOne({name: req.params.name}, function (err, obj) {
        if (req.params.name === "Willis"){
            var pic = (JSON.stringify(persons.bros.Willis));
            var willis_pic = JSON.parse(pic);
            return res.render('profile', {title: 'Sign Up', name: req.params.name, from: obj.burns, pic: willis_pic}) <--- want to get rid of this so we can insert the req.params.name variable but it won't work properly when trying to access the json obj.
        }
        else if(req.params.name === "Llama"){

            var pic = (JSON.stringify(persons.bros.Llama));
            var llama_pic = JSON.parse(pic);d
            return res.render('profile', {title: 'Sign Up', name: req.params.name, from: obj.burns, pic: llama_pic})
        }
        else if (req.params.name === "Carter"){
            var pic = (JSON.stringify(persons.bros.Carter));
            var carter_pic = JSON.parse(pic);
            return res.render('profile', {title: 'Sign Up', name: req.params.name, from: obj.burns, pic: carter_pic})

        }
        else if (req.params.name === "Quang"){
            var pic = (JSON.stringify(persons.bros.Quang));
            var quang_pic = JSON.parse(pic);
            return res.render('profile', {title: 'Sign Up', name: req.params.name, from: obj.burns, pic: quang_pic})
        }
        else if (req.params.name === "Maslow"){
            var pic = (JSON.stringify(persons.bros.Maslow));
            var maslow_pic = JSON.parse(pic);
            return res.render('profile', {title: 'Sign Up', name: req.params.name, from: obj.burns, pic: maslow_pic})
        }
        else if (req.params.name === "Beem"){
            var pic = (JSON.stringify(persons.bros.Beem));
            var beem_pic = JSON.parse(pic);
            return res.render('profile', {title: 'Sign Up', name: req.params.name, from: obj.burns, pic: beem_pic})
        }

【问题讨论】:

    标签: javascript node.js express web-development-server


    【解决方案1】:

    只需查找bros 对象上的req.params.name 属性,如果该属性存在,则渲染它。记住也不要忽略错误 - err 通常是提示您首先检查它的第一个参数:

    const name = req.params.name;
    User.findOne({ name }, function (err, obj) {
      if (err) {
        // make sure to handle errors, don't just ignore them
        // res.render... "there was an error"
        return;
      }
      const pic = persons.bros[name];
      if (!pic) {
        // handle case where the name is not in the object, if this is a possibility
        return;
      }
      return res.render('profile', {title: 'Sign Up', name, from: obj.burns, pic });
    });
    

    【讨论】:

    • 这很有效,看起来很棒,但我很困惑。你设置了 const pic = persons.bros[name]....为什么 name 在数组中,而不仅仅是 people.bros.name 就像它最初声明的那样?另外,你只是说persons.bros[name],[name]之前没有点符号吗?如果没有点,js如何知道如何在对象下点符号?
    • 这是括号符号,不是数组。例如,如果obj = { foo: 'x' } 并且你有一个带有foo 的变量const key = 'foo',那么你可以使用括号符号来查找对象上的键:const val = obj[key] 然后val === 'x'
    • 非常感谢您的帮助我的朋友,我真的很感激。快乐编码
    • 好吧,为了我的理智,我又向你撒了一个问题。这可以使用点符号来完成吗?如果是这样,请给出您的解决方案。已经编码 3 年了,我只使用过 dot,所以我在这上面浪费了这么多时间是有道理的
    • 不,仅使用点表示法是不可能的,因为要简洁地编写代码,您要查找其属性名称存储在变量中的属性,这是无法做到的用点表示法。
    【解决方案2】:

    试试这个

     User.findOne({name: req.params.name}, function (err, obj) {
        if ["Willis","Llama","Carter","Quang","Maslow","Beem"].includes(req.params.name){
            var pic = (JSON.stringify(persons.bros[req.params.name]));
            var tmp_pic = JSON.parse(pic);
            return res.render('profile', {title: 'Sign Up', name: req.params.name, from: obj.burns, pic: tmp_pic})
        }
    }
    

    【讨论】:

    • 谢谢你这个作品....你能详细说明一下发生了什么吗:“[“威利斯”,“骆驼”,“卡特”,“光”,“马斯洛” ","Beem"].includes(req.params.name)" 行?您创建一个名称数组,然后如果 req.params.name 在数组中,我们是否继续?另外,你在下一行说persons.bros[req.params.name]。 bros后面没有点吗?为什么 req.params.name 在括号中,因为它是一个数组?
    • 您提到的第一行检查变量req.params.name 是否包含在名称数组中。您提到的第二行访问对象persons.bros 中的属性req.params.name 据说我试图模仿您在问题中显示的确切功能。某些性能的答案将是一个更好的方法。
    猜你喜欢
    • 2021-11-11
    • 2016-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多