come sostituire le coincidenze chiave solo tra parentesi quadre?

sto lavorando su una qualche funzione che sostituisce le occorrenze di una stringa racchiusa tra parentesi quadre che corrisponde a una chiave, con il suo valore corrispondente da un dato oggetto, ma non so come sostituire solo quelle stringhe all’interno delle parentesi quadre, sostituisce tutto, apprezzerei il vostro aiuto:

questo è quello che ho provato finora:

function template(str, obj){
  let new_str = str;

  for (let key in obj) 
  {
       new_str = new_str.replace(new RegExp(key, 'g'), obj[key]);
  }
 console.log(new_str);
}

template("Hi [name], your balance is [balance]", { name: "Joe", balance: 1200 });

sto ottenendo:

"Hi [Joe], your 1200 is [12000]"

ma mi aspetto:

"Hi Joe, your balance is 12000"

EN From: How do I replace key coincidences only in square brackets?

More similar articles:

9 Comments

  1. perché i tasti sono racchiusi tra parentesi quadre, è necessario mettere che nel vostro modello pure:

    function template(str, obj) {
    let new_str = str;

    for (let key in obj) {
    new_str = new_str.replace(new RegExp('\\[' + key + '\\]', 'g'), obj[key]);
    }
    console.log(new_str);
    }

    template("Hi [name], your balance is [balance]", {
    name: "Joe",
    balance: 1200
    });

    si potrebbe anche prendere in considerazione l’uso di un solo regex con una funzione di sostituzione, per semplificare il codice:

    const template = (str, obj) => str.replace(
    /\[([^\]]*)\]/g,
    (match, possibleKey) => obj[possibleKey] ? obj[possibleKey] : match
    );

    console.log(template("Hi [name], your balance is [balance]", {
    name: "Joe",
    balance: 1200
    }));

    se ciò che è contenuto nelle parentesi quadre esiste sempre nell’oggetto, allora non c’è bisogno dell’operatore condizionale:

    const template = (str, obj) => str.replace(
    /\[([^\]]*)\]/g,
    (_, key) => obj[key]
    );

    console.log(template("Hi [name], your balance is [balance]", {
    name: "Joe",
    balance: 1200
    }));

    1. soluzione davvero cool!, Non ho ancora familiarità con la programmazione funzionale, Potete spiegarmi come funzionano le funzioni delle frecce annidate? grazie.

    2. è fondamentalmente solo un metodo che ho usato per ridurre il rumore della sintassi – le funzioni freccia possono avere un ritorno implicito, e sono più concise di quelle vere e proprie function s. l’espressione che segue il => verrà restituita immediatamente, senza richiedere una dichiarazione return
    3. forse solo me (c’è sempre più di un modo per farlo) ma preferirei l’espressione regolare /\[(.*?)\]/g Il quantificatore pigro è più conciso.

    4. @Wyck È più conciso, ma è anche meno efficiente. considera pigro, 44 passi contro avido, 4 passi. con alcuni modelli, può provocare una differenza di ordine di grandezza. prestazioni non importa nella maggior parte delle situazioni, ma è solo una abitudine ho avuto in

    5. quando una risposta risolve il problema, si può considerare la marcatura come accettato per indicare che il problema è risolto:)
  2. è necessario abbinare [] troppo. utilizzare alfabetizzati modello e avvolgere la chiave in [] nel vostro RegExp

    function template(str, obj){
    let new_str = str;

    for (let key in obj)
    {
    new_str = new_str.replace(new RegExp(`\\[${key}\\]`, 'g'), obj[key]);
    }
    console.log(new_str);
    }

    template("Hi [name], your balance is [balance]", { name: "Joe", balance: 1200 });

    1. grazie per la tua risposta, Non pensavo di utilizzare alfabetizzati modello, soluzione semplice ma efficace

Leave a Reply

Your email address will not be published. Required fields are marked *