2016-09-01 2 views
3

Предположим, что у меня есть две переменные, x и z, которые обозначают координаты. В моем JavaScript-коде я хотел бы, чтобы что-то конкретное происходило для комбинаций x/z (до тысячи). И поскольку код будет очень долго, я хотел бы знать, есть ли способ, чтобы сделать этот вид кода короче:Есть ли способ сэкономить место при написании огромного оператора if?

if (x == 12 && z == 14) { 
    doThis(23); 
    alert("doo"); 
    doThat(661); 
} 
if (x == 13 && z == 14) { 
    doThis(2345); 
    alert("dee"); 
    doThat(166); 
} 
if (x == 13 && z == 15) { 
    doThis(12); 
    alert("duu"); 
    doThat(44); 
} 

... и так далее. Я знаю, что для уменьшения размера файла & я могу удалить все пробелы и сделать все в одной строке - но как я могу сделать его еще короче?

EDIT: doThis() и doThat() - это всего лишь примеры «кода», который был бы там. В действительности во всех инструкциях if код будет совершенно другим. Теперь это изменилось.

+0

Являются ли они одинаковыми doThis и doThat? Если это так, вы можете создать массив действительных (x, y) и итерации на них, чтобы увидеть, применяется ли одна из них. –

+1

Попробуйте реорганизовать ваше решение, может быть? Если это не так, ваш лучший выбор - обфускация и минимизация решений. –

+0

Какие именно комбинации вы хотите проверить? – hindmost

ответ

0

Построить JSon объект таким образом, что:

"12" имеет "13" и "14" в нем,

"13" имеет "11" и "12" и "13" в нем ,

, поэтому сначала вы проверяете, существует ли z в этом объекте json, если x существует в этом объекте z в объекте json.

zxMap.hasOwnProperty('12') 

then if true, get that to another object variable(or an array) and check 

foundZ.hasOwnProperty('13') 

or 

foundZ.includes("13"); 

, то это должно дать истинным или ложным

так только 2 «если» s необходимы, как только вы построить этот объект JSON.

{ 
    "12": ["13","14"], 
    "13": ["11","12","13"] 
} 

затем написать две функции для проверки против г и х значений:

if(has_x(has_z("12"),"13")) 
{ 
    do_this();do_that(); 
} 

если do_this имеет отличиями,

{ 
    "12": {"13":"doo","14":"dee"}, 
    "13": {"11":"daa","12":"duu","13":"dii"}] 
} 

if(has_x(has_z("12"),"13")) 
{ 
    do_this(); 
    alert(extract_message("12","13")); 
    do_that(); 
} 

это может даже быть строкой кода в том, что последний элемент json, который должен выполняться как javascript.

eval(extract_message("12","13")); 
0

Если значения х и г определяют совершенно разные кодовые как вы предложили, то что-то подобное может упростить вещи.

var work = (function(){ 
 
    var _work = {}; 
 
    var _getKey = function(x, z){ return x + "~" + z;}; 
 
    var _set = function(x, z, fn) { _work[_getKey(x,z)] = fn; } 
 
    var _get = function(x, z) { return _work[_getKey(x,z)] ;} 
 
    return {get : _get, set : _set}; 
 
})(); 
 

 
work.set(12, 14, function(){ 
 
    // code unique to this combination of x and z 
 
    console.log("doo"); 
 
}); 
 

 
work.set(13, 14, function(){ 
 
    // code unique to this combination of x and z 
 
    console.log("dee"); 
 
}); 
 

 
work.set(13, 15, function(){ 
 
    // code unique to this combination of x and z 
 
    console.log("duu"); 
 
}); 
 

 
var x = 12; 
 
var z = 14; 
 
work.get(x, z)();

С другой стороны, если код такой же, для значений параметров (в вашем примере кода), за исключением, то что-то вроде этого (как это было предложено @Teemu и @hindmost) будет выше

function doThis(param){} 
 
function doThat(param){} 
 

 
var work = (function(){ 
 
    var _work = {}; 
 
    var _getKey = function(x, z){ return x + "~" + z;}; 
 
    var _set = function(x, z, args) { _work[_getKey(x,z)] = args; } 
 
    var _get = function(x, z) { return _work[_getKey(x,z)] ;} 
 
    return {get : _get, set : _set}; 
 
})(); 
 

 
work.set(12, 14, [23, "doo", 666]); 
 
work.set(13, 14, [2345, "dee", 166]); 
 
work.set(13, 15, [12, "duu", 44]); 
 

 
var x = 12; 
 
var z = 14; 
 
var args = work.get(x, z); 
 

 
doThis(args[0]); 
 
console.log(args[1]); 
 
doThat(args[2]);

Учитывая, что x и z сейчас обозначены как координаты, примечание в вашем оригинальном посте от @OregonTrail, вероятно, в правильном направлении.

Смежные вопросы