Подтвердить что ты не робот

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

У 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?

4b9b3361

Ответ 1

Другой подход, используя метод 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"

Ответ 2

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

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

Ответ 3

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

Ответ 4

Взято из библиотеки 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); 

Ответ 5

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

Пример: 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.

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

Ответ 6

ТЛ; др

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)

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

Ответ 7

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

String.prototype.format = function (arguments) {
    var this_string = '';
    for (var char_pos = 0; char_pos < this.length; char_pos++) {
        this_string = this_string + this[char_pos];
    }

    for (var key in arguments) {
        var string_key = '{' + key + '}'
        this_string = this_string.replace(new RegExp(string_key, 'g'), arguments[key]);
    }
    return this_string;
};

'The time is {time} and today is {day}, {day}, {day}. Oh, and did I mention that the time is {time}.'.format({day:'Monday',time:'2:13'});
//'The time is 2:13 and today is Monday, Monday, Monday. Oh, and did I mention that the time is 2:13.'

Ответ 8

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 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

Ответ 9

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

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

Ответ 10

JavaScript не имеет такой функции AFAIK.

Вы можете создать его, изменив объект прототипа класса String, чтобы добавить метод format(), который принимает переменное количество аргументов.

В методе формата вам нужно будет получить значение экземпляра String (фактическая строка), а затем проанализировать его для "{}" и вставить соответствующий аргумент.

Затем верните новую строку вызывающему.

Ответ 11

JavaScript по умолчанию не имеет функции форматирования строк, хотя вы можете создать свой собственный или использовать кого-то другого (например, sprintf)

Ответ 13

Для тех, кто ищет простое решение 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)