Конкатенация строк с помощью операторов «if» в JavaScript

19

Я пытаюсь настроить скрипт для конкатенации некоторых переменных внутри строки , если они существуют , чтобы поместить соответствующие метаданные в отображаемый HTML-документ.

Мой код конкатенации:

data = "<html>\n<head>\n" + "</head>\n<body>\n\n" + paras.join("\n\n") + "\n\n</body>\n</html>";

Я пытаюсь добавить в него выражения if (между первым и вторым элементами):

    if (typeof metadata_title !== "undefined") {
        "<title>" + metadata_title + "</title>\n"
    }
    if (typeof metadata_author !== "undefined") {
        "<meta name=\"author\" content=\"" + metadata_author + "\"></meta>\n"
    }
    if (typeof metadata_date !== "undefined") {
        "<meta name=\"date\" content=\"" + metadata_date + "\"></meta>\n"
    }

Но я не могу добавить какие-либо из этих операторов непосредственно в код конкатенации (он выдает ошибку: Unexpected token ( ).

Как лучше всего я буду добавлять такие выражения в свою строку конкатенации?

    
задан 木川 炎星 08.09.2011 в 09:01
источник

5 ответов

32

Я бы использовал тернарный оператор :

data = "<html>\n"
     + "<head>\n" 
     + ( typeof metadata_title  !== "undefined" ?  "<title>" + metadata_title + "</title>\n"                             : "" )
     + ( typeof metadata_author !== "undefined" ?  "<meta name=\"author\" content=\"" + metadata_author + "\"></meta>\n" : "" )
     + ( typeof metadata_date   !== "undefined" ?  "<meta name=\"date\" content=\"" + metadata_date + "\"></meta>\n"     : "" )
     + "</head>\n"
     + "<body>\n"
     + "\n"
     + paras.join("\n\n")
     + "\n"
     + "\n"
     + "</body>\n"
     + "</html>"
;
    
ответ дан bluish 08.09.2011 в 09:07
источник
  • <путается об использовании typeof в этом случае. Почему бы просто не проверить, нет ли var undefined? .. –  Demian Brecht 08.09.2011 в 09:08
  • В исключительных случаях (var undefined = 'test';) результат неверен. Использование typeof является заставкой. –  scessor 08.09.2011 в 09:17
  • Если одна из переменных не определена вообще, вы получите ReferenceError. Я думаю, что это то, что имел в виду ОП. Твой отлично, если все три метаданные определены, конечно. –  Ray Toal 08.09.2011 в 09:23
5

Я мог бы сделать что-то немного другое (немного более сродни шаблонам), главным образом потому, что я ненавижу конкатенированный HTML-код, сделанный с помощью Javascript:

var metadata_title = "Hello";
var metadata_author = "Me";
var metadata_date = "2011-09-07";

var template = "<html>\
            <head>\
                <title>#title#</title>\
                <meta name=\"author\" content=\"#author#\"></meta>\
                <meta name=\"date\" content=\"#date#\"></meta>\
            </head>\
            <body>\
            </body>\
            </html>";

var data = template.replace("#title#", metadata_title != undefined ? metadata_title : "")
                   .replace("#author#", metadata_author != undefined ? metadata_author : "")
                   .replace("#date#", metadata_date != undefined ? metadata_date : "");

Конечно, есть небольшое количество дополнительных накладных расходов very , но для меня это более читаемый way .

    
ответ дан Demian Brecht 08.09.2011 в 09:26
источник
  • Как бы вы получили здесь «парас»? (Не то, чтобы это тяжело, я просто хотел бы посмотреть, что вы придумали, в отсутствие реального механизма tempating. Cheers.) –  Ray Toal 08.09.2011 в 09:32
  • Если нет чего-то, что мне не хватает (мне уже поздно), я, скорее всего, просто добавлю # paras # между тегами тела и заменим его так же, как и другие элементы будут заменены. . join просто возвращает строку, поэтому я предполагаю, что это сработает. –  Demian Brecht 08.09.2011 в 09:37
  • Ах, отлично, +1 –  Ray Toal 08.09.2011 в 09:40
5
data = "<html>\n<head>\n" 
    + (
        typeof metadata_title !== "undefined" ?
        "<title>" + metadata_title + "</title>\n" :
        ""
    )
    + (
        typeof metadata_author !== "undefined" ?
        "<meta name=\"author\" content=\"" + metadata_author + "\"></meta>\n" :
        ""
    )
    + (
        typeof metadata_date !== "undefined" ?
         "<meta name=\"date\" content=\"" + metadata_date + "\"></meta>\n" :
        ""
    )
    + "</head>\n<body>\n\n" 
    + paras.join("\n\n") 
    + "\n\n</body>\n</html>";
    
ответ дан scessor 08.09.2011 в 09:07
источник
1

Создайте весь документ в массив, затем присоединитесь к "\n" в конце. (Разумеется, для этого, конечно, не должно быть много новых линий, разбросанных по всему! И если вы на IE7 или меньше, Array#join значительно быстрее, чем повторная конкатенация строк.)

Код здесь: Ссылка

ОБНОВЛЕНИЕ Я забыл включить «парас» в первую скрипку. Код с парами находится здесь: Ссылка

Для тех, кто не хочет щелкнуть и попробовать, вот сценарий:

// Not going to define metadata_author just to be saved by typeof :-)
var metadata_title = "Hello";
var metadata_date = "2011-09-07";

// Okay 3 paras for fun
var paras = ["<p>paragraph1</p>", "<p>paragraph2</p>", "<p>paragraph3</p>"];

data = ["<html>", "<head>"]

if (typeof metadata_title !== "undefined") {
    data.push("<title>" + metadata_title + "</title>");
}
if (typeof metadata_author !== "undefined") {
    data.push("<meta name=\"author\" content=\"" + metadata_author + "\"></meta>");
}
if (typeof metadata_date !== "undefined") {
    data.push("<meta name=\"date\" content=\"" + metadata_date + "\"></meta>");
}

data.push("</head>");
data.push("<body>");
paras.forEach(function (p) {data.push(p);});   // Requires ES5; use a for-loop if you don't have it
data.push("</body>");
data.push("<html>");
data = data.join("\n");
alert(data);
    
ответ дан Ray Toal 08.09.2011 в 09:10
источник
1

Мне понравилась читаемость Demian Brecht , но я бы только изменил строку для regex , потому что функция replace () заменяет только первое совпадение (см. подробнее здесь: JavaScript .replace заменяет только первое совпадение )

var metadata_title = "Hello";
var metadata_author = "Me";
var metadata_date = "2011-09-07";

var template = "<html>\
            <head>\
                <title>#title#</title>\
                <meta name=\"author\" content=\"#author#\"></meta>\
                <meta name=\"date\" content=\"#date#\"></meta>\
            </head>\
            <body>\
            </body>\
            </html>";

var data = template.replace(/#title#/g, metadata_title != undefined ? metadata_title : "")
                   .replace(/#author#/g, metadata_author != undefined ? metadata_author : "")
                   .replace(/#date#/g, metadata_date != undefined ? metadata_date : "");
    
ответ дан Francisco Tomé Costa 12.10.2013 в 13:36
источник