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