JavaScript эквивалент функции Python format ()? - PullRequest
40 голосов
/ 12 февраля 2011

Python имеет эту прекрасную функцию, чтобы превратить это:

bar1 = 'foobar'
bar2 = 'jumped'
bar3 = 'dog'

foo = 'The lazy ' + bar3 + ' ' + bar2 ' over the ' + bar1
# The lazy dog jumped over the foobar

В это:

bar1 = 'foobar'
bar2 = 'jumped'
bar3 = 'dog'

foo = 'The lazy {} {} over the {}'.format(bar3, bar2, bar1)
# The lazy dog jumped over the foobar

Есть ли в JavaScript такая функция?Если нет, то как бы я создал тот, который следует тому же синтаксису, что и реализация Python?

Ответы [ 13 ]

45 голосов
/ 12 февраля 2011

Другой подход, использующий метод String.prototype.replace, с функцией «replacer» в качестве второго аргумента:

String.prototype.format = function () {
  var i = 0, args = arguments;
  return this.replace(/{}/g, function () {
    return typeof args[i] != 'undefined' ? args[i++] : '';
  });
};

var bar1 = 'foobar',
    bar2 = 'jumped',
    bar3 = 'dog';

'The lazy {} {} over the {}'.format(bar3, bar2, bar1);
// "The lazy dog jumped over the foobar"
19 голосов
/ 06 июля 2015

Есть способ, но не совсем с использованием формата.

 
    var name = "John";
    var age = 19;
    var message = `My name is ${name} and I am ${age} years old`;
    console.log(message);

jsfiddle - ссылка

10 голосов
/ 23 ноября 2013

Ища ответ на тот же вопрос, я только что нашел: https://github.com/davidchambers/string-format,, что означает "форматирование строки JavaScript, вдохновленное Python's str.format()". Кажется, это почти то же самое, что и функция format() в python.

5 голосов
/ 12 февраля 2011

Взято из библиотеки YAHOOs:

YAHOO.Tools.printf = function() { 
  var num = arguments.length; 
  var oStr = arguments[0];   
  for (var i = 1; i < num; i++) { 
    var pattern = "\\{" + (i-1) + "\\}"; 
    var re = new RegExp(pattern, "g"); 
    oStr = oStr.replace(re, arguments[i]); 
  } 
  return oStr; 
} 

Назовите это как:

bar1 = 'foobar'
bar2 = 'jumped'
bar3 = 'dog'

foo = YAHOO.Tools.printf('The lazy {0} {1} over the {2}', bar3, bar2, bar1); 
4 голосов
/ 22 октября 2018

tl; dr

foo = (a, b, c) => `The lazy ${a} ${b} over the ${c}`

Почему одних только строк шаблонов недостаточно

ES6 строк шаблонов предоставляют функцию, очень похожую на формат строк питонов.Тем не менее, вы должны знать переменные, прежде чем создавать строку:

var templateString = `The lazy ${bar3} ${bar2} over the ${bar1}`;

Почему формат?

Python str.format позволяет вам указать строку перед вамидаже знать, какие значения вы хотите включить в него, например:

foo = 'The lazy {} {} over the {}'

bar1 = 'foobar'
bar2 = 'jumped'
bar3 = 'dog'

foo.format(bar3, bar2, bar1)

Решение

С помощью функции стрелка мы можем элегантно обернуть строку шаблона для дальнейшего использования:

foo = (a, b, c) => `The lazy ${a} ${b} over the ${c}`

bar1 = 'foobar';
bar2 = 'jumped';
bar3 = 'dog';

foo(bar3, bar2, bar1)

Конечно, это работает и с обычной функцией, но функция стрелки позволяет нам сделать это однострочным.Обе функции доступны в большинстве браузеров и во время выполнения:

4 голосов
/ 12 февраля 2011

Вот моя первая попытка. Не стесняйтесь указывать на недостатки.

Пример: http://jsfiddle.net/wFb2p/5/

String.prototype.format = function() {
    var str = this;
    var i = 0;
    var len = arguments.length;
    var matches = str.match(/{}/g);
    if( !matches || matches.length !== len ) {
        throw "wrong number of arguments";
    }
    while( i < len ) {
        str = str.replace(/{}/, arguments[i] );
        i++;
    }
    return str;
};

РЕДАКТИРОВАТЬ: Сделано это немного более эффективным, исключив вызов .match() в операторе while.

РЕДАКТИРОВАТЬ: Изменено так, что выдается та же ошибка, если вы не передаете никаких аргументов.

2 голосов
/ 14 мая 2019

Усандо сплит:

String.prototype.format = function (args) {
    var text = this
    for(var attr in args){
        text = text.split('${' + attr + '}').join(args[attr]);
    }
    return text
};

json = {'who':'Gendry', 'what':'will sit', 'where':'in the Iron Throne'}
text = 'GOT: ${who} ${what} ${where}';

console.log('context: ',json);
console.log('template: ',text);
console.log('formated: ',text.format(json));

Usando Regex:

String.prototype.format = function (args) {
    var text = this
    for(var attr in args){
        var rgx = new RegExp('${' + attr + '}','g');
        text = text.replace(rgx, args[attr]);
    }
    return text
};

json = {'who':'Gendry', 'what':'will sit', 'where':'in the Iron Throne'}
text = 'GOT: ${who} ${what} ${where}';

console.log('context: ',json);
console.log('template: ',text);
console.log('formated: ',text.format(json));
1 голос
/ 23 февраля 2015

JS:

String.prototype.format = function () {
    var str = this;
    for (var i = 0; i < arguments.length; i++) {
        str = str.replace('{' + i + '}', arguments[i]);
    }
    return str;
}

bar1 = 'foobar';
bar2 = 'jumped';
bar3 = 'dog';

python_format = 'The lazy {2} {1} over the {0}'.format(bar1,bar2,bar3);

document.getElementById("demo").innerHTML = "JavaScript equivalent of Python's format() function:<br><span id='python_str'>" + python_format + "</span>";

HTML:

<p id="demo"></p>

CSS:

span#python_str {
    color: red;
    font-style: italic;
}

ВЫВОД:

JavaScript-эквивалент функции Python format ():

Ленивый пес перепрыгнул через foobar

DEMO:

jsFiddle

1 голос
/ 15 августа 2014

Этот код позволяет вам точно указать, какие скобки заменить какими строками.Скобки не обязательно должны быть в том же порядке, что и аргументы, и возможны несколько скобок.Функция форматирования принимает массив значений в качестве параметра, причем каждый ключ является одной из «переменных» в скобках, которая заменяется соответствующим значением.

0 голосов
/ 29 января 2019

Для тех, кто ищет простое решение ES6.

Прежде всего, я предоставляю функцию вместо расширения собственного прототипа String, потому что это обычно не рекомендуется.

// format function using replace() and recursion

const format = (str, arr) => arr.length > 1 
	? format(str.replace('{}', arr[0]), arr.slice(1)) 
	: (arr[0] && str.replace('{}', arr[0])) || str

// Example usage

const str1 = 'The {} brown {} jumps over the {} dog'

const formattedString = formatFn(str1, ['quick','fox','lazy'])

console.log(formattedString)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...