9

我想要一个模仿 python .format() 函数的javascript函数,它的工作方式类似于

.format(*args, **kwargs)

上一个问题为 '.format(*args) 提供了一个可能的(但不完整的)解决方案

JavaScript 等价于 printf/string.format

我希望能够做到

"hello {} and {}".format("you", "bob"
==> hello you and bob

"hello {0} and {1}".format("you", "bob")
==> hello you and bob

"hello {0} and {1} and {a}".format("you", "bob",a="mary")
==> hello you and bob and mary

"hello {0} and {1} and {a} and {2}".format("you", "bob","jill",a="mary")
==> hello you and bob and mary and jill

我意识到这是一项艰巨的任务,但也许在某个地方有一个完整的(或至少部分的)解决方案,其中也包括关键字参数。

哦,我听说 AJAX 和 JQuery 可能有这方面的方法,但我希望能够在没有所有开销的情况下做到这一点。

特别是,我希望能够将它与谷歌文档的脚本一起使用。

谢谢

4

2 回答 2

13

更新:如果您使用 ES6,模板字符串的工作方式非常类似于String.formathttps ://developers.google.com/web/updates/2015/01/ES6-Template-Strings

如果不是,则以下适用于上述所有情况,其语法与 python 的String.format方法非常相似。下面的测试用例。

String.prototype.format = function() {
  var args = arguments;
  this.unkeyed_index = 0;
  return this.replace(/\{(\w*)\}/g, function(match, key) { 
    if (key === '') {
      key = this.unkeyed_index;
      this.unkeyed_index++
    }
    if (key == +key) {
      return args[key] !== 'undefined'
      ? args[key]
      : match;
    } else {
      for (var i = 0; i < args.length; i++) {
        if (typeof args[i] === 'object' && typeof args[i][key] !== 'undefined') {
          return args[i][key];
        }
      }
      return match;
    }
  }.bind(this));
};

// Run some tests
$('#tests')
  .append(
    "hello {} and {}<br />".format("you", "bob")
  )
  .append(
    "hello {0} and {1}<br />".format("you", "bob")
  )
  .append(
    "hello {0} and {1} and {a}<br />".format("you", "bob", {a:"mary"})
  )
  .append(
    "hello {0} and {1} and {a} and {2}<br />".format("you", "bob", "jill", {a:"mary"})
  );
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="tests"></div>

于 2012-11-30T05:37:42.690 回答
0

这应该类似于 python 的工作,format但是对于具有命名键的对象,它也可以是数字。

String.prototype.format = function( params ) {
  return this.replace(
    /\{(\w+)\}/g, 
    function( a,b ) { return params[ b ]; }
  );
};

console.log( "hello {a} and {b}.".format( { a: 'foo', b: 'baz' } ) );
//^= "hello foo and baz."
于 2012-11-30T05:31:25.703 回答