返回任意次数的字符串的最佳或最简洁的方法是什么?
以下是我目前为止拍得最好的照片:
function repeat(s, n){
var a = [];
while(a.length < n){
a.push(s);
}
return a.join('');
}
返回任意次数的字符串的最佳或最简洁的方法是什么?
以下是我目前为止拍得最好的照片:
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(s, n) { var r=""; for (var a=0;a<n;a++) r+=s; return r;}
要在指定次数内重复一个字符串,可以使用JavaScript中内置的repeat()方法。
下面是一个重复以下字符串4次的例子:
const name = "king";
const repeat = name.repeat(4);
console.log(repeat);
输出:
"kingkingkingking"
或者我们可以创建自己版本的repeat()函数,如下所示:
function repeat(str, n) {
if (!str || !n) {
return;
}
let final = "";
while (n) {
final += s;
n--;
}
return final;
}
console.log(repeat("king", 3))
(最初发布于https://reactgo.com/javascript-repeat-string/)
各种方法的测试:
var repeatMethods = {
control: function (n,s) {
/* all of these lines are common to all methods */
if (n==0) return '';
if (n==1 || isNaN(n)) return s;
return '';
},
divideAndConquer: function (n, s) {
if (n==0) return '';
if (n==1 || isNaN(n)) return s;
with(Math) { return arguments.callee(floor(n/2), s)+arguments.callee(ceil(n/2), s); }
},
linearRecurse: function (n,s) {
if (n==0) return '';
if (n==1 || isNaN(n)) return s;
return s+arguments.callee(--n, s);
},
newArray: function (n, s) {
if (n==0) return '';
if (n==1 || isNaN(n)) return s;
return (new Array(isNaN(n) ? 1 : ++n)).join(s);
},
fillAndJoin: function (n, s) {
if (n==0) return '';
if (n==1 || isNaN(n)) return s;
var ret = [];
for (var i=0; i<n; i++)
ret.push(s);
return ret.join('');
},
concat: function (n,s) {
if (n==0) return '';
if (n==1 || isNaN(n)) return s;
var ret = '';
for (var i=0; i<n; i++)
ret+=s;
return ret;
},
artistoex: function (n,s) {
var result = '';
while (n>0) {
if (n&1) result+=s;
n>>=1, s+=s;
};
return result;
}
};
function testNum(len, dev) {
with(Math) { return round(len+1+dev*(random()-0.5)); }
}
function testString(len, dev) {
return (new Array(testNum(len, dev))).join(' ');
}
var testTime = 1000,
tests = {
biggie: { str: { len: 25, dev: 12 }, rep: {len: 200, dev: 50 } },
smalls: { str: { len: 5, dev: 5}, rep: { len: 5, dev: 5 } }
};
var testCount = 0;
var winnar = null;
var inflight = 0;
for (var methodName in repeatMethods) {
var method = repeatMethods[methodName];
for (var testName in tests) {
testCount++;
var test = tests[testName];
var testId = methodName+':'+testName;
var result = {
id: testId,
testParams: test
}
result.count=0;
(function (result) {
inflight++;
setTimeout(function () {
result.start = +new Date();
while ((new Date() - result.start) < testTime) {
method(testNum(test.rep.len, test.rep.dev), testString(test.str.len, test.str.dev));
result.count++;
}
result.end = +new Date();
result.rate = 1000*result.count/(result.end-result.start)
console.log(result);
if (winnar === null || winnar.rate < result.rate) winnar = result;
inflight--;
if (inflight==0) {
console.log('The winner: ');
console.log(winnar);
}
}, (100+testTime)*testCount);
}(result));
}
}
人们将这一问题过于复杂,甚至浪费了表现。数组?递归?你在跟我开玩笑吧。
function repeat (string, times) {
var result = ''
while (times-- > 0) result += string
return result
}
编辑。我做了一些简单的测试,与artistoex / disfated和其他一些人发布的按位版本进行比较。后者只是稍微快一点,但内存效率高了几个数量级。对于单词'blah'的1000000次重复,使用简单的串联算法(上面),Node进程的容量达到46兆字节,而使用对数算法只有5.5兆字节。后者绝对是正确的选择。为了清晰起见,我将其转发:
function repeat (string, times) {
var result = ''
while (times > 0) {
if (times & 1) result += string
times >>= 1
string += string
}
return result
}
新读者注意:这个答案很老,而且不太实用——它只是“聪明”,因为它使用Array的东西来获取 串事情做完了。当我写“更少的过程”时,我肯定是指 “更少的代码”,因为,正如其他人在随后的回答中指出的那样,它 表演像猪一样。所以如果你看重速度就不要用它。
我将把这个函数直接放到String对象上。与其创建一个数组,填充它,然后用一个空字符连接它,不如创建一个适当长度的数组,然后用你想要的字符串连接它。同样的结果,更少的过程!
String.prototype.repeat = function( num )
{
return new Array( num + 1 ).join( this );
}
alert( "string to repeat\n".repeat( 4 ) );