2017-06-28 11 views
0

Je veux substituer des variables dans une chaîne comme le fait console.log. Ce que je veux obtenir quelque chose comme ceci:Substituer des variables dans des chaînes comme console.log

let str = 'My %s is %s.'; 

replaceStr(string, /* args */) { 
    // I need help with defining this function 
}; 

let newStr = replaceStr(str, 'name', 'Jackie'); 
console.log(newStr); 
// output => My name is Jackie. 

/* 
    This is similar to how console.log does: 
    // console.log('I\'m %s.', 'Jack'); 
    // => I'm Jack. 
*/ 

Je ne suis pas en mesure de comprendre comment faire. Toute aide sera très appréciée.

Merci.

+1

Y at-il une raison quelconque vous ne l'utilisez [template 'literals'] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Template_literals)? –

+0

@ChristopherMoore Ce que je veux réaliser n'est pas ce que les littéraux offrent. –

Répondre

2

Vous pouvez ce prototype à l'objet String. Quelque chose comme ceci:

String.prototype.sprintf = function() { 
    var counter = 0; 
    var args = arguments; 

    return this.replace(/%s/g, function() { 
     return args[counter++]; 
    }); 
}; 

let str = 'My %s is %s.'; 
str = str.sprintf('name', 'Alex'); 
console.log(str); // 'My name is Alex' 
+0

Oui, c'est une très belle façon. –

+0

Content de pouvoir aider un peu :) – lexith

1

Vous pouvez utiliser la propagation opérateur (ES6):

function replaceStr(string, ...placeholders) { 
    while (placeholders.length > 0) { 
     string = string.replace('%s', placeholders.shift()); 
    } 

    return string; 
} 

EDIT: Sur la base de la réponse de lexith, nous pouvons éviter la boucle explicite:

function replaceStr(string, ...placeholders) { 
    var count = 0; 
    return string.replace(/%s/g,() => placeholders[count++]); 
} 
+0

Je pensais à cela, mais j'espérais une méthode sans utiliser de boucles. Est-ce que c'est possible? –

+0

Cela fonctionne uniquement avec ES6 – Ajay

+0

@anonymous group pas vraiment ... –

0

Si j'espère que vous voulez avoir la fonction de journal personnalisé.
console.log peut remplacer %s, avec l'approche ci-dessous votre fonction personnalisée obtient l'ensemble des fonctionnalités de console.log et son plus efficace.

function myLogger() { 
    if(logEnabled) { 
     // you can play with arguments for any customisation's 
     // arguments[0] is first string 
     // prepend date in log arguments[0] = (new Date().toString()) + arguments[0] ; 
     console.log.apply(console, arguments); 
    } 
}