返回任意次数的字符串的最佳或最简洁的方法是什么?

以下是我目前为止拍得最好的照片:

function repeat(s, n){
    var a = [];
    while(a.length < n){
        a.push(s);
    }
    return a.join('');
}

当前回答

首先,OP的问题似乎是关于简明性的——我理解的意思是“简单易读”,而大多数答案似乎是关于效率的——这显然不是一回事,而且我认为,除非你实现了一些非常具体的大型数据操作算法,否则当你实现基本的数据操作Javascript函数时,不应该担心。简洁更重要。

其次,正如André Laszlo所指出的,字符串。repeat是ECMAScript 6的一部分,并且已经在几个流行的实现中可用——因此是String最简洁的实现。重复是不执行的;-)

最后,如果您需要支持不提供ECMAScript 6实现的主机,André Laszlo提到的MDN的polyfill一点也不简洁。

所以,废话不多说——下面是我简洁的填充:

String.prototype.repeat = String.prototype.repeat || function(n){
    return n<=1 ? this : this.concat(this.repeat(n-1));
}

是的,这是递归。我喜欢递归——它们很简单,如果操作正确,很容易理解。关于效率,如果语言支持它,如果写得正确,它们可以非常高效。

从我的测试来看,这种方法比Array快60%。加入的方法。虽然它显然与disfate的实现相去甚远,但它比两者都要简单得多。

我的测试设置是节点v0.10,使用“严格模式”(我认为它支持某种TCO),对一个10个字符的字符串调用repeat(1000)一百万次。

其他回答

function repeat(pattern, count) {
  for (var result = '';;) {
    if (count & 1) {
      result += pattern;
    }
    if (count >>= 1) {
      pattern += pattern;
    } else {
      return result;
    }
  }
}

你可以在JSFiddle上测试它。以hacky Array为基准。粗略地说,我的速度是10倍(Chrome)到100倍(Safari)到200倍(Firefox)(取决于浏览器)。

String.prototype.repeat现在是ES6标准。

'abc'.repeat(3); //abcabcabc

首先,OP的问题似乎是关于简明性的——我理解的意思是“简单易读”,而大多数答案似乎是关于效率的——这显然不是一回事,而且我认为,除非你实现了一些非常具体的大型数据操作算法,否则当你实现基本的数据操作Javascript函数时,不应该担心。简洁更重要。

其次,正如André Laszlo所指出的,字符串。repeat是ECMAScript 6的一部分,并且已经在几个流行的实现中可用——因此是String最简洁的实现。重复是不执行的;-)

最后,如果您需要支持不提供ECMAScript 6实现的主机,André Laszlo提到的MDN的polyfill一点也不简洁。

所以,废话不多说——下面是我简洁的填充:

String.prototype.repeat = String.prototype.repeat || function(n){
    return n<=1 ? this : this.concat(this.repeat(n-1));
}

是的,这是递归。我喜欢递归——它们很简单,如果操作正确,很容易理解。关于效率,如果语言支持它,如果写得正确,它们可以非常高效。

从我的测试来看,这种方法比Array快60%。加入的方法。虽然它显然与disfate的实现相去甚远,但它比两者都要简单得多。

我的测试设置是节点v0.10,使用“严格模式”(我认为它支持某种TCO),对一个10个字符的字符串调用repeat(1000)一百万次。

使用Lodash来实现Javascript的实用功能,比如重复字符串。

Lodash提供了良好的性能和ECMAScript兼容性。

我强烈推荐它用于UI开发,它在服务器端也很好用。

下面是如何使用Lodash重复字符串“yo”2次:

> _.repeat('yo', 2)
"yoyo"

简单的方法:

String.prototype.repeat = function(num) {
    num = parseInt(num);
    if (num < 0) return '';
    return new Array(num + 1).join(this);
}