Tengo una cadena con decir: My Name is %NAME% and my age is %AGE%.
%XXX%
son marcadores de posición. Necesitamos sustituir valores allí de un objeto.
El objeto se parece a: {"%NAME%":"Mike","%AGE%":"26","%EVENT%":"20"}
Necesito analizar el objeto y reemplazar la cadena con los valores correspondientes. Entonces ese resultado final será:
Mi nombre es Mike y mi edad es 26.
Todo debe hacerse usando javascript puro o jquery.
javascript
jquery
string
string-formatting
Joby Joseph
fuente
fuente
{NAME: "Mike", AGE: 26, EVENT: 20}
? Por supuesto, aún necesitaría que estas teclas aparezcan con signos de porcentaje en la cadena de entrada.Respuestas:
Los requisitos de la pregunta original claramente no podrían beneficiarse de la interpolación de cadenas, ya que parece que es un procesamiento en tiempo de ejecución de claves de reemplazo arbitrarias.
Sin embargo , si solo tuviera que hacer una interpolación de cadenas, puede usar:
const str = `My name is ${replacements.name} and my age is ${replacements.age}.`
Tenga en cuenta las comillas inversas que delimitan la cadena, son obligatorias.
Para obtener una respuesta que se adapte a los requisitos del OP en particular, puede usar
String.prototype.replace()
para los reemplazos.El siguiente código manejará todas las coincidencias y no las tocará sin un reemplazo (siempre que sus valores de reemplazo sean todas cadenas, si no, vea a continuación).
var replacements = {"%NAME%":"Mike","%AGE%":"26","%EVENT%":"20"}, str = 'My Name is %NAME% and my age is %AGE%.'; str = str.replace(/%\w+%/g, function(all) { return replacements[all] || all; });
jsFiddle .
Si algunos de sus reemplazos no son cadenas, asegúrese de que existan primero en el objeto. Si tiene un formato como el del ejemplo, es decir, envuelto en signos de porcentaje, puede usar el
in
operador para lograrlo.jsFiddle .
Sin embargo, si su formato no tiene un formato especial, es decir, ninguna cadena, y su objeto de reemplazo no tiene un
null
prototipo, utiliceObject.prototype.hasOwnProperty()
, a menos que pueda garantizar que ninguna de sus posibles subcadenas reemplazadas chocará con los nombres de propiedad en el prototipo.jsFiddle .
De lo contrario, si su cadena de reemplazo fuera
'hasOwnProperty'
, obtendría una cadena desordenada resultante.jsFiddle .
Como nota al margen, debería llamarse
replacements
unObject
, no unArray
.fuente
return replacements[all] || all
que cubra los%NotInReplacementsList%
casos.return all in params ? params[all] : all;
0
. En este caso no funcionó.¿Qué tal el uso de literales de plantilla ES6?
var a = "cat"; var b = "fat"; console.log(`my ${a} is ${b}`); //notice back-ticked string
Más sobre las plantillas literales ...
fuente
Puede usar JQuery (jquery.validate.js) para que funcione fácilmente.
$.validator.format("My name is {0}, I'm {1} years old",["Bob","23"]);
O si desea usar solo esa función, puede definir esa función y usarla como
function format(source, params) { $.each(params,function (i, n) { source = source.replace(new RegExp("\\{" + i + "\\}", "g"), n); }) return source; } alert(format("{0} is a {1}", ["Michael", "Guy"]));
crédito al equipo de jquery.validate.js
fuente
$.each
queString.prototype.format=function(p){var s=this,r=function(v,i){s=s.replace(new RegExp("\\{"+i+"\\}","g"),v);};p.forEach(r);return s;}
puedas hacer que no tengas que incluir jquery solo para ese;)Al igual que con los navegadores modernos, marcador de posición es apoyada por la nueva versión de Chrome / Firefox, similar a la función de estilo C
printf()
.Marcadores de posición:
%s
Cuerda.%d
,%i
Número entero.%f
Número de coma flotante.%o
Hipervínculo de objeto.p.ej
console.log("generation 0:\t%f, %f, %f", a1a1, a1a2, a2a2);
Por cierto, para ver la salida:
Ctrl + Shift + J
oF12
para abrir la herramienta de desarrollo.Ctrl + Shift + K
oF12
para abrir la herramienta de desarrollo.@Update - soporte de nodejs
Parece que nodejs no es compatible
%f
, en cambio, podría usarse%d
en nodejs. Con%d
número se imprimirá como número flotante, no solo como entero.fuente
Solo usa
replace()
var values = {"%NAME%":"Mike","%AGE%":"26","%EVENT%":"20"}; var substitutedString = "My Name is %NAME% and my age is %AGE%.".replace("%NAME%", $values["%NAME%"]).replace("%AGE%", $values["%AGE%"]);
fuente
Puede usar una función de reemplazo personalizada como esta:
var str = "My Name is %NAME% and my age is %AGE%."; var replaceData = {"%NAME%":"Mike","%AGE%":"26","%EVENT%":"20"}; function substitute(str, data) { var output = str.replace(/%[^%]+%/g, function(match) { if (match in data) { return(data[match]); } else { return(""); } }); return(output); } var output = substitute(str, replaceData);
Puedes verlo funcionar aquí: http://jsfiddle.net/jfriend00/DyCwk/ .
fuente
Si quieres hacer algo más cercano a console.log como reemplazar% s marcadores de posición como en
>console.log("Hello %s how are you %s is everything %s?", "Loreto", "today", "allright") >Hello Loreto how are you today is everything allright?
yo escribí esto
function log() { var args = Array.prototype.slice.call(arguments); var rep= args.slice(1, args.length); var i=0; var output = args[0].replace(/%s/g, function(match,idx) { var subst=rep.slice(i, ++i); return( subst ); }); return(output); } res=log("Hello %s how are you %s is everything %s?", "Loreto", "today", "allright"); document.getElementById("console").innerHTML=res;
<span id="console"/>
conseguirás
>log("Hello %s how are you %s is everything %s?", "Loreto", "today", "allright") >"Hello Loreto how are you today is everything allright?"
ACTUALIZAR
He agregado una variante simple tan
String.prototype
útil cuando se trata de transformaciones de cadenas, aquí está:String.prototype.log = function() { var args = Array.prototype.slice.call(arguments); var rep= args.slice(0, args.length); var i=0; var output = this.replace(/%s|%d|%f|%@/g, function(match,idx) { var subst=rep.slice(i, ++i); return( subst ); }); return output; }
En ese caso lo harás
"Hello %s how are you %s is everything %s?".log("Loreto", "today", "allright") "Hello Loreto how are you today is everything allright?"
Prueba esta versión aquí
fuente
formatMessage(message: string, values: string[]) { let i = 0; return message.replace(/%\w+%/g, (match, idx) => { return values[i++]; }); }
esto toma un mensaje para formatear y una matriz de valores de reemplazo y busca%SOME_VALUE%
Actualmente todavía no existe una solución nativa en Javascript para este comportamiento. Las plantillas etiquetadas son algo relacionado, pero no lo resuelvas.
Aquí hay un refactor de la solución de Alex con un objeto para reemplazos.
La solución utiliza funciones de flecha y una sintaxis similar para los marcadores de posición como la interpolación nativa de Javascript en literales de plantilla (en
{}
lugar de%%
). Además, no es necesario incluir delimitadores (%
) en los nombres de los reemplazos.Hay dos sabores: descriptivo y reducido.
Solución descriptiva:
const stringWithPlaceholders = 'My Name is {name} and my age is {age}.'; const replacements = { name: 'Mike', age: '26', }; const string = stringWithPlaceholders.replace( /{\w+}/g, placeholderWithDelimiters => { const placeholderWithoutDelimiters = placeholderWithDelimiters.substring( 1, placeholderWithDelimiters.length - 1, ); const stringReplacement = replacements[placeholderWithoutDelimiters] || placeholderWithDelimiters; return stringReplacement; }, ); console.log(string);
Solución reducida:
const stringWithPlaceholders = 'My Name is {name} and my age is {age}.'; const replacements = { name: 'Mike', age: '26', }; const string = stringWithPlaceholders.replace(/{\w+}/g, placeholder => replacements[placeholder.substring(1, placeholder.length - 1)] || placeholder, ); console.log(string);
fuente
stringWithPlaceholders.replace(/{(\w+)}/g, (fullMatch, group1) => replacements[group1] || fullMatch )
Esto te permite hacer exactamente eso
NPM: https://www.npmjs.com/package/stringinject
GitHub: https://github.com/tjcafferkey/stringinject
Haciendo lo siguiente:
var str = stringInject("My username is {username} on {platform}", { username: "tjcafferkey", platform: "GitHub" }); // My username is tjcafferkey on Git
fuente
Aquí hay otra forma de hacer esto mediante el uso de literales de plantilla es6 dinámicamente en tiempo de ejecución.
const str = 'My name is ${name} and my age is ${age}.' const obj = {name:'Simon', age:'33'} const result = new Function('const {' + Object.keys(obj).join(',') + '} = this.obj;return `' + str + '`').call({obj}) document.body.innerHTML = result
fuente
Como ejemplo rápido:
var name = 'jack'; var age = 40; console.log('%s is %d yrs old',name,age);
La salida es:
fuente
console.log
?const stringInject = (str = '', obj = {}) => { let newStr = str; Object.keys(obj).forEach((key) => { let placeHolder = `#${key}#`; if(newStr.includes(placeHolder)) { newStr = newStr.replace(placeHolder, obj[key] || " "); } }); return newStr; }
Input: stringInject("Hi #name#, How are you?", {name: "Ram"}); Output: "Hi Ram, How are you?"
fuente
Utilice esta función.
function format() { if (arguments.length === 0) { throw "No arguments"; } const string = arguments[0]; const lst = string.split("{}"); if (lst.length !== arguments.length) { throw "Placeholder format mismatched"; } let string2 = ""; let off = 1; for (let i = 0; i < lst.length; i++) { if (off < arguments.length) { string2 += lst[i] + arguments[off++] } else { string2 += lst[i] } } return string2; }
Ejemplo
format('My Name is {} and my age is {}', 'Mike', 26);
Salida
fuente