Javascript 这个条件语句有没有更简洁的解决方案?

Javascript 这个条件语句有没有更简洁的解决方案?,javascript,Javascript,有没有一种更干净、更简洁的方法来编写以下在Javascript中创建字符串的条件语句 var search; if (text === '' && user === '' && filter !== '') { search = filter; } else if (filter === '' && text === '' && user !== '') { search = 'email="' + user + '

有没有一种更干净、更简洁的方法来编写以下在Javascript中创建字符串的条件语句

var search;

if (text === '' && user === '' && filter !== '') {
    search = filter;
} else if (filter === '' && text  === '' && user !== '') {
  search = 'email="' + user + '"';
} else if (filter === '' && user  === '' && text !== '') {
  search = 'text~"' + text  + '"';
} else if (text !== '' && user  !== '' && filter === '') {
    search = 'text~"' + text + '" ANDemail="' + user + '"';
} else if (text !== '' && filter  !== '' && user === '') {
    search = 'text~"' + text + '" AND ' + filter;
} else {
  search = 'text~"' + text + '" AND ' + filter + '" ANDemail="' + user + '"';
}

在我脑海中,你可以做一件事来简化这件事,那就是使用js规则“falsy”来简化这件事。此外,回路短路也会有所帮助

var search;

function getSearch(user, text, filter) {
    if (!text && !user && filter) return filter;
    if (!filter && !text && user) return 'email="' + user + '"';
    if (!filter && !user && text ) return 'text~"' + text  + '"';
    if (text && user && !filter) return 'text~"' + text + '" ANDemail="' + user + '"';
    if (text && filter && !user) return 'text~"' + text + '" AND ' + filter;
    return 'text~"' + text + '" AND ' + filter + '" ANDemail="' + user + '"';
}

search = getSearch(user, text, filter);   

我想那有点干净。如果字符串的格式不是那么奇怪,它可以被清理很多,但我假设它是特定的和必需的,因此这将保持您在“搜索”字符串中所追求的确切格式。

//使用computed switch

var TEXT = 1,   haveText = (text !== "") << 0;
var FILTER = 2, haveFilter = (filter !== "") << 1;
var USER = 4,   haveUser = (user !== "") << 2;

switch(haveText + haveFilter + haveUser)
{
case FILTER:  search = filter; break;
case USER:    search = 'email="' + user + '"'; break;
case TEXT: search = 'text~"' + text  + '"'; break;
case TEXT+USER: search = 'text~"' + text + '" AND email="' + user + '"'; break;
case TEXT+FILTER: search = 'text~"' + text + '" AND ' + filter; break;
case TEXT+FILTER+USER: search = 'text~"' + text + '" AND ' + filter + '" AND email="' + user + '"'; break;
case FILTER+USER: search = filter + '" AND email="' + user + '"'; break;
default: search = ""; // no search criteria
}

var TEXT=1,haveText=(TEXT!==“”)您可以创建一个函数来构建搜索字符串,这样以后就可以轻松地添加更多变量。构建器很混乱,这是一个混乱的过程,但无论添加多少变量,它都不会变得更混乱。另一方面,请记住,在这种情况下(有很多条件句),您可以考虑使用多态性进行重构,但这在这里可能对您不起作用。这里有一把小提琴:

函数buildSearchString(文本、用户、过滤器){
var returnString='';
var字符串=[];
if(text){strings.push('text~='+text);}
if(user){strings.push('email='+user);}
如果(过滤器){
strings.push(filter);}
var length=strings.length;
对于(变量i=0;i
以下内容可能符合“简明”标准,但可能不符合“清洁”标准:

var text='someText';
var过滤器=“”;
var user='aUser';
var search=text?“text~“'+text+'”:'';
搜索+=搜索和筛选?“和'+过滤器:过滤器?过滤器:“”;
搜索+=搜索和用户?&S和电子邮件=“+user+””:user?“电子邮件=“”+用户+”:“”;

document.write('Search:'+Search);//text~“someText”和email=“aUser”
我唯一能想到的就是将
text===''
切换到
!文本
过滤器!=''
to
filter
只需这样:
如果(!text&&!user&&filter)
您的代码当前运行正常,您希望改进它。一般来说,这些问题对本网站来说过于固执己见,但你可能会在网站上找到更好的运气。请记住阅读,因为它们比本网站更严格。如果所有参数都是空字符串,那么
搜索
将是
未定义的
@zerkms,那又怎样呢。没有检查我是否复制了整个逻辑。关键是,如果你真的需要15个比较来构建搜索字符串,或者仅仅需要3个,也许4个。关键是如果你考虑了所有的要求(而不仅仅是一个子集,它允许你提供一些好看的东西),你的实现将比我们在问题中遇到的更糟糕。@zerkms我可以接受,你确实可以,但是你没有回答这个问题(因为这个建议没有任何改进)
var TEXT = 1,   haveText = (text !== "") << 0;
var FILTER = 2, haveFilter = (filter !== "") << 1;
var USER = 4,   haveUser = (user !== "") << 2;

switch(haveText + haveFilter + haveUser)
{
case FILTER:  search = filter; break;
case USER:    search = 'email="' + user + '"'; break;
case TEXT: search = 'text~"' + text  + '"'; break;
case TEXT+USER: search = 'text~"' + text + '" AND email="' + user + '"'; break;
case TEXT+FILTER: search = 'text~"' + text + '" AND ' + filter; break;
case TEXT+FILTER+USER: search = 'text~"' + text + '" AND ' + filter + '" AND email="' + user + '"'; break;
case FILTER+USER: search = filter + '" AND email="' + user + '"'; break;
default: search = ""; // no search criteria
}
function buildSearchString(text, user, filter) {
var returnString = '';
var strings = [];
if (text) {strings.push('text~ =' + text);}
if (user) {strings.push('email = ' + user);}
if(filter){
    strings.push(filter);}
var length = strings.length;
for(var i =0; i < length; ++i){
    var s = strings[i];
    if(i ===length -1){
         returnString += s;              
    }
    else{
        returnString += s+' AND '  ;            
    }                                                    
}
return returnString;
}
alert(buildSearchString('', 'there', 'guy'));