Eu tenho uma string com dizer: My Name is %NAME% and my age is %AGE%.
%XXX%
são marcadores de posição. Precisamos substituir valores ali de um objeto.
O objeto se parece com: {"%NAME%":"Mike","%AGE%":"26","%EVENT%":"20"}
Preciso analisar o objeto e substituir a string pelos valores correspondentes. Portanto, esse resultado final será:
Meu nome é Mike e tenho 26 anos.
Tudo deve ser feito usando puro javascript ou jquery.
javascript
jquery
string
string-formatting
Joby Joseph
fonte
fonte
{NAME: "Mike", AGE: 26, EVENT: 20}
? Você ainda exigiria que essas chaves apareçam delimitadas por sinais de porcentagem na string de entrada, é claro.Respostas:
Os requisitos da pergunta original claramente não poderiam se beneficiar da interpolação de strings, pois parece que é um processamento em tempo de execução de chaves de substituição arbitrárias.
No entanto , se você apenas teve que fazer interpolação de string, você pode usar:
Observe os crases que delimitam a string, eles são obrigatórios.
Para obter uma resposta adequada aos requisitos específicos do OP, você pode usar
String.prototype.replace()
para as substituições.O código a seguir tratará todas as correspondências e não as alterará sem uma substituição (desde que os valores de substituição sejam todos strings, caso contrário, veja abaixo).
jsFiddle .
Se algumas de suas substituições não forem strings, certifique-se de que elas existam primeiro no objeto. Se você tiver um formato como o exemplo, ou seja, envolto em sinais de porcentagem, você pode usar o
in
operador para fazer isso.jsFiddle .
No entanto, se seu formato não tiver um formato especial, ou seja, qualquer string, e seu objeto de substituição não tiver um
null
protótipo, useObject.prototype.hasOwnProperty()
, a menos que você possa garantir que nenhuma de suas possíveis substrings substituídas entrará em conflito com nomes de propriedade no protótipo.jsFiddle .
Caso contrário, se sua string de substituição fosse
'hasOwnProperty'
, você obteria uma string bagunçada resultante.jsFiddle .
Como uma nota lateral, você deve ser chamado
replacements
umObject
, e não umArray
.fonte
return replacements[all] || all
para cobrir%NotInReplacementsList%
casos.return all in params ? params[all] : all;
0
. Neste caso, não funcionou.Que tal usar literais de modelo ES6?
Mais sobre literais de modelo ...
fonte
Você pode usar JQuery (jquery.validate.js) para fazê-lo funcionar facilmente.
Ou se você quiser usar apenas esse recurso, você pode definir essa função e usá-la como
crédito para a equipe jquery.validate.js
fonte
$.each
vocêString.prototype.format=function(p){var s=this,r=function(v,i){s=s.replace(new RegExp("\\{"+i+"\\}","g"),v);};p.forEach(r);return s;}
, não precisa incluir jquery apenas para aquele;)Tal como acontece com navegador moderno, espaço reservado é suportado pela nova versão do Chrome / Firefox, semelhante como a função de estilo C
printf()
.Marcadores de posição:
%s
Corda.%d
,%i
Número inteiro.%f
Número de ponto flutuante.%o
Hiperlink do objeto.por exemplo
BTW, para ver a saída:
Ctrl + Shift + J
ouF12
para abrir a ferramenta de desenvolvedor.Ctrl + Shift + K
ouF12
para abrir a ferramenta de desenvolvedor.@Update - suporte a nodejs
Parece que nodejs não oferece suporte
%f
, em vez disso, poderia usar%d
em nodejs. Com%d
número será impresso como número flutuante, não apenas inteiro.fonte
Apenas use
replace()
fonte
Você pode usar uma função de substituição personalizada como esta:
Você pode ver o funcionamento aqui: http://jsfiddle.net/jfriend00/DyCwk/ .
fonte
Se você quiser fazer algo mais próximo do console.log, como substituir% s marcadores de posição, como em
eu escrevi isto
você vai ter
ATUALIZAR
Eu adicionei uma variante simples como
String.prototype
útil ao lidar com transformações de string, aqui está:Nesse caso, você fará
Experimente esta versão aqui
fonte
formatMessage(message: string, values: string[]) { let i = 0; return message.replace(/%\w+%/g, (match, idx) => { return values[i++]; }); }
isso leva a mensagem para o formato e a matriz de valores de substituição e procura%SOME_VALUE%
Isso permite que você faça exatamente isso
NPM: https://www.npmjs.com/package/stringinject
GitHub: https://github.com/tjcafferkey/stringinject
Fazendo o seguinte:
fonte
Como um exemplo rápido:
O resultado é:
fonte
console.log
?Aqui está outra maneira de fazer isso usando literais de modelo es6 dinamicamente em tempo de execução.
fonte
fonte
Use esta função.
Exemplo
Resultado
fonte
Atualmente ainda não existe uma solução nativa em Javascript para este comportamento. Os modelos marcados são algo relacionado, mas não resolvem.
Aqui há um refator da solução de alex com um objeto para substituições.
A solução usa funções de seta e uma sintaxe semelhante para os marcadores de posição como a interpolação Javascript nativa em literais de modelo (em
{}
vez de%%
). Além disso, não há necessidade de incluir delimitadores (%
) nos nomes das substituições.Existem dois sabores: descritivo e reduzido.
Solução descritiva:
Solução reduzida:
fonte