Вложенный ifs для проверки, выполняется ли одно или оба из двух условий - PullRequest
0 голосов
/ 08 ноября 2011

У меня есть объект, data, который может содержать или не содержать элементы site_with_same_coords и / или site_with_same_name.Я проверяю их, и если один или оба существуют, я предупреждаю пользователя:

if (data.site_with_same_coords){
    var SameCoordsExists = true;
    same_coords_message = 'The site ';
    same_coords_message += data.site_with_same_coords.name;
    same_coords_message += 'already already exists in the location you have indicated';
}

if (data.site_with_same_name){
    var SameNameExists = true;
    same_name_message = 'The site ';
    same_name_message += data.site_with_same_name.name;
    same_name_message += 'already already exists in a differnt location from the one you have indicated';
}

if (SameCoordsExists && SameNameExists){
    if(data.site_with_same_name.id != data.site_with_same_coords.id){
        alert(same_coords_message + '\n' + same_name_message);
    }else if (SameCoordsExists){
        alert(same_coords_message);
    }
    }else if (SameNameExists){
        alert(same_name_message);
    }
}

Есть ли лучший способ сделать это?

Ответы [ 2 ]

1 голос
/ 08 ноября 2011

Конечно, вы можете поместить их в массив и объединить их:

var messages = [];

if(data.site_with_same_coords) {
    messages.push('The site ' + data.site_with_same_coords.name + ' already exists in the location you have indicated');
}

if(data.site_with_same_name && !(data.site_with_same_coords && data.site_with_same_name.id === data.site_with_same_coords.id)) {
    messages.push('The site ' + data.site_with_same_name.name + ' already exists in a different location from the one you have indicated');
}

alert(messages.join('\n'));

Кроме того, пользователь не будет немного смущен, если получит сообщение:

Сайт some_site уже существует в указанном вами месте
Сайт some_other_site уже существует в другом месте, отличном от указанного вами

? Просто мысль.

0 голосов
/ 30 апреля 2012

Этот скелет:

if (A && B) {
  if (C)
    print(msgA);
  print(msgB);
} else {
  print(msgA);
}

можно переписать так:

var AB = A && B;
if ((AB && C) || !AB)
  print(msgA);
if (AB)
  print(msgB);

Как видите, msgA и msgB появляются только один раз, так что вы можете создавать строки на лету прямо там, где они напечатаны. Очевидно, в вашем случае A будет data.site_with_same_coords, B будет data.site_with_same_name, а C будет data.site_with_same_name.id != data.site_with_same_coords.id.

Само собой разумеется, что переписанная версия гораздо менее читабельна.

обновление: если вам действительно нужно оповещение (), тогда вы должны сделать:

var AB = A && B;
if ((AB && C) || !AB)
  msg += msgA;
if (AB)
  msg += msgB;
if (msg)
  alert(msg);
...