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



是否有一种更干净、更简洁的方式来编写下面的条件语句,在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 + '"';
}

//使用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
}

使复合if语句版本中的两个可能的错误突出:

  1. FILTER+USER的情况没有被测试,并且使用TEXT产生一个搜索,
  2. 没有标准的情况没有在if语句中测试,并且还使用TEXT产生搜索。

在我的脑海中,你可以做的一件事是简化这是使用js规则"false",它简化了这一点。此外,带返回的短路也会有所帮助。

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);   

我觉得这样比较干净。如果字符串的格式不是那么奇怪,它可以被清理很多,但我假设它是特定的和必需的,所以这保持了你在"搜索"字符串中所追求的确切格式。

可以创建一个函数来构建搜索字符串,这样以后就可以轻松地添加更多变量。构建器是混乱的,它是一个混乱的过程,但它不会变得更混乱,不管你添加多少变量。作为一个旁注,记住,在某些情况下,像这样(有很多条件),你可以考虑使用多态性重构,但这可能不适合你。此操作的步骤如下:https://jsfiddle.net/ytg1rxu8/

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'));

以下内容可能符合"简洁"的标准,但可能不符合"简洁"的标准:

var text = 'someText';
var filter = '';
var user = 'aUser';
var search = text? 'text~"' + text + '"' : '';
search += search && filter? ' AND ' + filter : filter? filter : '';
search += search && user? ' AND email="' + user + '"' : user? 'email="' + user + '"' : '';
document.write('Search: ' + search); // text~"someText" AND email="aUser"

var search;
if (filter)
    search = appendFilter(search, filter);
if (text)
    search = appendFilter(search, 'text~"' + text  + '"');
if (user)
    search = appendFilter(search, 'email="' + user + '"');
function appendFilter(search, f) {
    return search ? search + ' AND ' + f : f;
}

最新更新