Сокращения Javascript - PullRequest
4 голосов
/ 20 мая 2011

Если я могу сказать:

var big = (x > 10) ? true : false;

вместо:

var big;
if (x > 10) {
    big = true;
}
else {
    big = false;
}

как мне сделать это так же короче?

var now = new Date

if (now.getHours() < 5) {
    return "late night pick me up";
}
else if (now.getHours() < 9) {
    return "breakfast";
}
else if (now.getHours() < 13) {
    return "lunch";
}
else if (now.getHours() < 17) {
    return "afternoon snak";
}
else {
    return "dinner";
}

Спасибо большое, куча!

Ответы [ 9 ]

9 голосов
/ 05 августа 2011
var now = new Date().getHours();

return now < 5 ? "late night pick me up" :
       now < 9 ? "breakfast" :
       now < 13 ? "lunch" :
       now < 17 ? "afternoon snak" : "dinner";
4 голосов
/ 20 мая 2011

Нельзя без кучки грязных вложенных троичных операторов.Тернарный оператор хорош только для одного лайнера.

3 голосов
/ 20 мая 2011

Вы, вероятно, не хотите, поскольку, возможно, это будет менее читабельным. Тем не менее, вы можете просто вложить тернарный оператор так:

var now = (now.getHours() < 5) ? "late night pick me up" : ((now.getHours() < 9) ? "breakfast" : ((now.getHours() < 13) ? "lunch" : ((now.getHours() < 17) ? "afternoon snack" : "dinner")))));

Я надеюсь, вы понимаете, почему это не очень хорошая идея!

Более длинное, более сложное условие, подобное этому, обычно требует нескольких строк и хорошего разделения блоков, чтобы их было легко понять - и хотя вы, возможно, можете добавить разрывы строк, стандартные блоки if-else в конечном итоге выйдут победителями в четком выражении ваше намерение.

3 голосов
/ 20 мая 2011

Вы не можете сказать, что конкретно, лично я бы просто написал это так:

if (now.getHours() < 5) return "late night pick me up";
else if (now.getHours() < 9) return "breakfast";
else if (now.getHours() < 13) return "lunch";
else if (now.getHours() < 17) return "afternoon snak";
else return "dinner";

Это не так уж плохо?

2 голосов
/ 20 мая 2011

Сначала попробуйте var big = x > 10; вместо var big = (x > 10) ? true : false;

Во-вторых, вам не нужно if-else, когда у вас есть возврат.

//looks  a little confusing, but you can move the return to line after ifs
var now = new Date  
if (now.getHours() < 5)  return "late night pick me up"; 
if (now.getHours() < 9)  return "breakfast";
if (now.getHours() < 13) return "lunch";
if (now.getHours() < 17) return "afternoon snak";
return "dinner"; 
1 голос
/ 08 сентября 2012

Я наткнулся на это в поисках чего-то еще. Вот небольшой сокращенный трюк, использующий логические операторы и использующий строковые литералы факта: truey =]

var hr = new Date().getHours();

return hr < 5 && 'late night pick me up' 
    || hr < 9 && 'breakfast' 
    || hr < 13 && 'lunch' 
    || hr < 17 && 'afternoon snack' 
    || 'dinner';
1 голос
/ 20 мая 2011

Вы всегда можете использовать оператор switch:

switch(true)
{
case (now.getHours() < 5):
  return "late night pick me up";
  break;
case (now.getHours() < 9):
  return "breakfast";
  break;  //etc...
default:
  return "dinner";
}
1 голос
/ 20 мая 2011

Это будет выглядеть довольно грязно:

return ((now.getHours() < 5)?"late night pick me up":
         ((now.getHours() < 9)?"breakfast":
            ((now.getHours() < 13)?"lunch":
               ((now.getHours() < 17)?"afternoon snack":
                  "dinner"
               )
            )
          )
       );

Вы должны помнить, чтобы соответствовать скобки.

0 голосов
/ 20 мая 2011

Вы всегда можете использовать таблицу для репликации функциональности:

var now = new Date();
var meals = [
    "late night pick me up",
    "breakfast",
    "lunch",
    "afernoon snack",
    "dinner"];
return meals[parseInt(now.getHours()-4)/4];
...