Vorlagenliterale mit einem ForEach darin

Lesezeit: 3 Minuten

Stevens Benutzeravatar
Stefan

Ist es möglich, einen Zeichenfolgenwert zurückzugeben in ForEach in einem Vorlagenliteral, damit es an dieser Stelle hinzugefügt wird? Denn wenn ich es logge, kehrt es zurück undefined. Oder ist das so wie ich geschrieben habe gar nicht möglich?

return `<div>
                <form id='changeExchangeForViewing'>
    <label for="choiceExchangeForLoading">Change the exchange</label>
    <div class="form-inline">
    <select id='choiceExchangeForLoading' name="choiceExchangeForLoading" class="form-control">

    ${Object.keys(obj).forEach(function (key) {
        return "<option value="" + key + "">" + obj[key] + "</option>"           
    })}
    `;

Benutzeravatar von TJ Crowder
TJ Crowder

Nein, weil forEach ignoriert den Rückgabewert seines Rückrufs und gibt niemals etwas zurück (der Aufruf führt daher zu undefined).

Du schaust nach mapwas geht Exakt was du willst:

return `<div>
    <form id='changeExchangeForViewing'>
        <label for="choiceExchangeForLoading">Change the exchange</label>
        <div class="form-inline">
            <select id='choiceExchangeForLoading' name="choiceExchangeForLoading" class="form-control">
                ${Object.keys(obj).map(function (key) {
                    return "<option value="" + key + "">" + obj[key] + "</option>"
                }).join("")}
`;

Beachten Sie, dass der Code nach der Zuordnung verwendet .join("") um eine einzelne Zeichenfolge aus dem Array zu erhalten (ohne Trennzeichen). (Ich habe das anfangs vergessen – ich habe zu viel React-Zeug gemacht – aber stephledev hat in seiner/ihrer Antwort darauf hingewiesen.)

Das heißt, es ist möglicherweise einfacher zu lesen, wenn Sie es aufteilen, und Sie können eine Pfeilfunktion anstelle einer herkömmlichen Funktion verwenden, möglicherweise mit einem anderen Vorlagenliteral:

const options = Object.keys(obj).map((key) =>
    `<option value="${key}">${obj[key]}</option>`
);
return `<div>
    <form id='changeExchangeForViewing'>
        <label for="choiceExchangeForLoading">Change the exchange</label>
        <div class="form-inline">
            <select id='choiceExchangeForLoading' name="choiceExchangeForLoading" class="form-control">
                ${options.join("")}
`;

Abschließend werde ich erwähnen Object.entrieswas Ihnen einen Pfeil von gibt [key, value] Arrays, die Sie könnte beim Zuordnen der Optionen verwenden möchten (oder nicht, Object.keys geht auch gut):

const options = Object.entries(obj).map((key, value) =>
    `<option value="${key}">${value}</option>`
);
return `<div>
    <form id='changeExchangeForViewing'>
        <label for="choiceExchangeForLoading">Change the exchange</label>
        <div class="form-inline">
            <select id='choiceExchangeForLoading' name="choiceExchangeForLoading" class="form-control">
                ${options.join("")}
`;

Randnotiz: Das ist kein “String-Literal”, es ist ein Vorlage wörtlich.

  • Ich denke, es gibt ungefähr 15 Minuten, in denen man nicht akzeptieren kann

    – mdatsew

    21. Januar 2018 um 15:21 Uhr

  • @nitte93user3232918 Ich muss 9 Minuten warten

    – Stefan

    21. Januar 2018 um 15:22 Uhr

  • Ich würde vorschlagen, dass es besser wäre, den Code aus Gründen der Übersichtlichkeit in eine Funktion zu verschieben und damit ein separates Vorlagenliteral im Callback verwendet werden kann.

    Benutzer8897421

    21. Januar 2018 um 15:28 Uhr

  • @rockstar: Ja, dem stimme ich voll und ganz zu.

    – TJ Crowder

    21. Januar 2018 um 15:32 Uhr

  • @GalibHasanov – Weil das Ergebnis des Aufrufs forEach ist immer undefinedsondern das Ergebnis des Aufrufs map ist ein Array mit den abgebildeten Inhalten.

    – TJ Crowder

    1. Dezember 2018 um 17:13 Uhr

Seit map() ein Array zurückgibt, erzeugt die Antwort von @TJ Crowder ungültiges HTML als die toString() -Methode eines Arrays wird innerhalb des Vorlagenliterals aufgerufen, das Kommas verwendet, um das Array zu begrenzen. Um dies zu beheben, hängen Sie einfach an join('') um explizit kein Trennzeichen zu verwenden:

${Object.keys(obj).map(key => (
    `<option value="${key}">${obj[key]}</option>`
)).join('')}

Außerdem können Sie Template-Literale innerhalb der Map selbst verwenden.

  • Wenn Sie eine solche kleine Auslassung sehen, ist es sinnvoller, einen Kommentar abzugeben und den Antwortenden darüber zu informieren. (Ich habe in letzter Zeit zu viel React gemacht!) SO soll kollaborativ sein.

    – TJ Crowder

    1. Dezember 2018 um 17:12 Uhr


  • Zu Ihrer Information, jeder, der diese Kommentare zu stephledevs Antwort liest, der Fix ist in die akzeptierte Antwort integriert, sodass hier nichts zu sehen ist. 😉

    – bugmenot123

    5. November 2019 um 8:58 Uhr

  • Genau das, was ich in Literalen gesucht habe.

    – sg28

    29. Oktober 2021 um 2:10 Uhr

1442840cookie-checkVorlagenliterale mit einem ForEach darin

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy