这条件声明是否有更清洁的解决方案?

时间:2015-09-24 22:44:14

标签: javascript

是否有更简洁,更简洁的方法来编写以下在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 + '"';
}

5 个答案:

答案 0 :(得分:1)

//使用计算机开关

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
}
如果语句版本突出,

在复合中产生两个可能的错误:

  1. 未对FILTER + USER进行测试,并使用TEXT进行搜索,
  2. 没有标准的情况未在if语句中测试,也使用TEXT进行搜索。

答案 1 :(得分:0)

在我的头脑中,你可以做的一件事就是使用js规则&#39;&#39; 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);   

我认为这有点清洁。如果字符串的格式不是那么奇怪,它可以被清理很多,但我假设它具体而且必需,所以这样可以保持你在之后的确切格式。 &#34;搜索&#34;字符串。

答案 2 :(得分:0)

您可以创建一个函数来构建搜索字符串,这样您将来可以轻松添加更多变量。建设者很乱,这是一个混乱的过程,但无论你添加多少变量,它都不会变得更加混乱。作为旁注,请记住,在某些情况下(有很多条件)你可以考虑使用多态来重构,但这可能不适合你。这方面的小提琴就在这里: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'));

答案 3 :(得分:0)

以下内容可能符合“简洁”标准,但可能不适合“清洁”:

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"

答案 4 :(得分:-1)

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