NodeJs – 优化多个if

这是我的代码:

Search.prototype.makeQuery = function (data) { let result = {}; if (data.orderId) { result["order_id"] = data.orderId; } if (data.userMobileNumber) { result["user.Number"] = {$regex : data.userMobileNumber} } if (data.userFullName) { result["user.Name"] = {$regex: data.userFullName} } return result; }; 

所有我想要的是find更好的方法来优化我的代码,并减lessif条件在我的代码。 有什么build议吗?

可以避免打包, if当你把它包装到一个函数和键入data 解构 。
if在这种情况下包装成函数的好处是,你可以简单地testing它,它是可重用的,易于阅读

 Search.prototype.makeQuery = function (data) { let result = {} let {orderId, userMobileNumber, userFullName} = data setObjectValue(orderId, result, "order_id", orderId) setObjectValue(userMobileNumber, result, "user.Number", {$regex : userMobileNumber}) setObjectValue(userFullName, result, "user.Name", {$regex: userFullName}) return result; } function setObjectValue(condition, object, key, value) { if(condition) { object[key] = value } } 

 function makeQuery (data) { let result = {} let {orderId, userMobileNumber, userFullName} = data setObjectValue(orderId, result, "order_id", orderId) setObjectValue(userMobileNumber, result, "user.Number", {$regex : userMobileNumber}) setObjectValue(userFullName, result, "user.Name", {$regex: userFullName}) return result; } function setObjectValue(condition, object, key, value) { if(condition) { object[key] = value } } let data = { orderId: 1, userMobileNumber: "016875447895", userFullName: "John Doe" } let query = makeQuery(data) console.log(query) 

一个更简单的方法:

 Search.prototype.makeQuery = function (data) { let result = {}; data.orderId && (result["order_id"] = data.orderId); data.userMobileNumber && (result["user.Number"] = {$regex : data.userMobileNumber}); data.userFullName && (result["user.Name"] = {$regex: data.userFullName}); return result; }; 

让我们想象你有很多领域,或者你想修改他们,你会创build一个地图。 现在,你的代码工作,我的解决scheme是矫枉过正,但它可能在未来有用:

 const interestingData = new Map() //I tried to imitate your values. // Use whatever function you want here as a callback. // value is the value you request, the callback must return the value you want to set. interestingData.set("order_id", value => value) interestingData.set("user.Number", value => ({ $regevalue: value })) interestingData.set("user.Name", value => ({ $regevalue: value })) //Tgis is a Factory in case you need several search. const makeSearch = fields => data => { let result = {} fields.forEach((callBack, field) => { if (data[field]) result[field] = callBack(data[field]) }) return result } //Creating a searching function const myResearch = makeSearch(interestingData) //Fake examples const data1 = { order_id: 'ertyui', "user.Number": "ertyuio", "user.Name": "ertyuio", azerr: 123456 } const data2 = { order_id: 'ertyui', "user.Number": "ertyuio", } console.log(myResearch(data1)) console.log(myResearch(data2)) 

不知道如果你认为这是代码优化,但你可以摆脱if语句使用Object.assign

 Search.prototype.makeQuery = function (data) { return Object.assign({}, data.orderId && { order_id: data.orderId }, data.userMobileNumber && { 'user.Number': { $regex : data.userMobileNumber }, }, data.userFullName && { 'user.Name': { $regex : data.userFullName }, }, ) }; 

如果您可以使用更新的JSfunction(使用转译器或其他方式),则可以使用Object rest/spread来获得更简洁的语法:

 Search.prototype.makeQuery = (data) => ({ ...data.orderId && { order_id: data.orderId }, ...data.userMobileNumber && { 'user.Number': { $regex : data.userMobileNumber }, }, ...data.userFullName && { user.Name': { $regex : data.userFullName }, }, }); 

编辑1:请注意,所有这些都是纯粹的function,没有发生任何变化