2017-06-28 65 views
0

我想用console.log這樣的字符串替換變量。 我想實現的是這樣的:像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. 
*/ 

我無法弄清楚如何做到這一點。任何幫助都感激不盡。

謝謝。

+1

有沒有使用任何理由['模板literals'(https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Template_literals)? –

+0

@ChristopherMoore我想實現的不是模板文字提供的內容。 –

回答

2

你可以把它的原型到String對象。類似這樣的:

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

是的,這是一個非常好的方法。 –

+0

很高興我可以幫助一下:) – lexith

1

您可以使用傳播運營商(ES6):

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

    return string; 
} 

編輯:基於lexith的回答中,我們可以避開顯式循環:

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

我在想這個,但我希望沒有使用循環的方法。這甚至有可能嗎? –

+0

它只適用於ES6 – Ajay

+0

@匿名組不是真的... –

0

如果希望你想擁有自定義記錄功能。
console.log可以替代%s,用下面的方法你的自定義函數獲取完整的console.log特性集並且更加高效。

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); 
    } 
}