9

次のように機能する python .format() 関数を模倣する JavaScript 関数が欲しい

.format(*args, **kwargs)

前の質問は、'.format(*args) の可能な (完全ではない) 解決策を提供します。

printf/string.format に相当する JavaScript

できるようになりたい

"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 にはおそらくこのためのメソッドがあると聞きましたが、オーバーヘッドなしで実行できるようにしたいと考えています。

特に、Google ドキュメントのスクリプトで使用できるようにしたいと考えています。

ありがとう

4

2 に答える 2

13

更新: ES6 を使用している場合、テンプレート文字列は次のように機能しString.formatます: https://developers.google.com/web/updates/2015/01/ES6-Template-Strings

String.formatそうでない場合、以下は上記のすべてのケースで機能し、Python のメソッドと非常によく似た構文を使用します。以下のテストケース。

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 に答える