4

我正在尝试实施Array.repeat,所以

[3].repeat(4) // yields
=> [3, 3, 3, 3]

...并且让我发疯。

试过这个:

Array::repeat = (num)->
  array = new Array
  for n in [0..num]
    array.concat(this)
  array

[3].repeat(x)总是返回[]。我在哪里搞砸了?还是有更好的方法来做到这一点?

最后结果:

Array::repeat = (num)->
  array = new Array
  return array if num < 1
  for n in [1..num]
    array = array.concat(this)
  array

['a'].repeat(5)
=> ['a', 'a', 'a', 'a', 'a']
4

3 回答 3

9

array.concat返回一个新数组并且不修改现有数组。

你需要写

array = array.concat(dup)

或者,您可以使用push(),它会修改原始数组:

array.push.apply(array, dup)
于 2013-02-08T14:31:01.913 回答
1

这很简单:

function repeat(array, n){
    var out = [];
    for(var i = 0; i < n; i++) {
        out = out.concat(array);
    }
    return out;
}

或原型设计:

Array.prototype.repeat = function(n){
    var out = [];
    for(var i = 0; i < n; i++) {
        out = out.concat(this);
    }
    return out;
}

那是原生 JS,不知道你会如何在 CoffeeScript 中做到这一点。

于 2013-02-08T14:37:07.827 回答
0

我认为函数应该是这样的:

Array.prototype.repeat = function(count) {
    if(count==null||1*count!=count)  //check for cerrect count
        return this.valueOf(); 
    var length = this.length;     //Length
    var return = this.valueOf();  //0 repats equals in the same array
    for(var i=0; i<count; i++) {  //Repeating the count
      for(var j=0; j<length; j++) {
        return.push(this[j]);
      }
    }
}
于 2013-02-08T14:36:26.950 回答