Javascript 这个条件语句有没有更简洁的解决方案?
有没有一种更干净、更简洁的方法来编写以下在Javascript中创建字符串的条件语句Javascript 这个条件语句有没有更简洁的解决方案?,javascript,Javascript,有没有一种更干净、更简洁的方法来编写以下在Javascript中创建字符串的条件语句 var search; if (text === '' && user === '' && filter !== '') { search = filter; } else if (filter === '' && text === '' && user !== '') { search = 'email="' + user + '
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===''
切换到!文本
或过滤器!=''
tofilter
只需这样:如果(!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'));