如何减少if语句的数量

时间:2016-05-13 12:42:07

标签: javascript node.js mongodb express mean-stack

您好我是自学习MEAN堆栈并且有一个关于如何减少代码中的if检查量的问题。

基本上用户可以填写他/她的设置页面,然后点击输入我们然后将数据发送到服务器,这样我们就可以更新mongo。

我似乎唯一的方法就是让用户能够编辑某些字段而不是所有字段都是为了确保发送到服务器的数据不等于null但是肯定必须有更好的然后通过为每个字段运行if语句。

有问题的代码就是这个

        //user.username = req.body.username;

    if ( age != null) {

        user.age = age;

    }
    if ( bio != null) {

        user.bio = bio;

    }

    if ( location != null) {

        user.location = location;

    }

    if ( team != null) {

        user.team = team;

    }

    if ( tags != null) {

        user.tags = tags;

    }

    if ( email != null) {

        user.email = email;

    }

客户端代码

    $scope.savesettings = function(provider){
    var theUser = JSON.parse(localStorage.getItem("User-Data"));
    var user = theUser["_id"];
    var request = {};
    var request = {

        user: user,
        username: $scope.settings_username,
        email: $scope.settings_email,
        age: $scope.settings_age,
        location: $scope.settings_location,
        team: $scope.settings_team,
        bio:$scope.settings_bio,
        profilebanner: $scope.settings_profilebanner,
        avatar: $scope.settings_avatar

    };

    console.log(request);

    //send to server
    $http.put('api/social/updatesettings', request).success(function(response){

        alertify.success("Your settings have been successfully saved.");

            localStorage.clear();
            localStorage.setItem('User-Data', JSON.stringify(response));



    }).error(function(error){

        alertify.error("Hmmm an issue has occured.");

     });


};

服务器代码

var User = require('../../datasets/userModel');

module.exports.updatesettings = function(req,res){

    var age = req.body.age;
    var bio = req.body.bio;
    var location = req.body.location;
    var team = req.body.team;
    var tags = req.body.tags;
    var email = req.body.email;
    var profilebanner = req.body.profilebanner;
    var avatar = req.body.avatar;

User.findOne({_id: req.body.user}, function (err, user){


    //user.username = req.body.username;

    if ( age != null) {

        user.age = age;

    }
    if ( bio != null) {

        user.bio = bio;

    }

    if ( location != null) {

        user.location = location;

    }

    if ( team != null) {

        user.team = team;

    }

    if ( tags != null) {

        user.tags = tags;

    }

    if ( email != null) {

        user.email = email;

    }

    user.save(function(err){

        if (err){
            console.log(err);
            res.status(500).send();
            //res.json(user);
        } else {
            console.log("success");
             res.json(user);
        }
    })
});

};

4 个答案:

答案 0 :(得分:2)

考虑使用Object.assign。它合并两个或多个对象,后者优先。以下假设data是一个包含agebio等的对象,user就是......你的user对象。

var results = Object.assign({}, user, data);

有这样的polyfill,如果你碰巧使用jQuery,$.extend主要做同样的工作。

答案 1 :(得分:0)

您可以将所有属性添加到用户对象。

var user = {
   age: age,
   bio: bio,
   location: location
}

然后删除空值的键。

for (var key in user) {
   if (user[key] === null) {
      delete user[key];
   }
}

答案 2 :(得分:0)

传递变量数组的函数如何使用some查看其中是否有null

function isComplete(args) {
  return !args.some(function(el) {
    return el === null;
  });
}

var age = null;
var bio = 'Something';
var location = null;

isComplete([age, bio, location]); // false

答案 3 :(得分:0)

if不是问题所在。问题是您向用户显示了他们不应该看到的字段,因此问题出在表示层中。

修复那一系列if就像地毯下的尘埃一样,看起来你想为你的用户提供角色,所以在你的代码中要清楚易懂。

您可以使用服务器端生成的HTML修复此问题,这样的事情(语法可能有问题,但我希望您明白这一点):

<% if (user.canSetTeam()) { %>
  <input type="text" name="team" />
<% } %>

因此,在您的HTML中,您将获得正确的字段。

查看http://expressjs.com/en/guide/using-template-engines.html