488

Python では、[2]はリストであり、次のコードで次の出力が得られます。

[2] * 5 # Outputs: [2,2,2,2,2]

JavaScript の配列でこれを行う簡単な方法はありますか?

私はそれを行うために次の関数を書きましたが、より短いかより良いものはありますか?

var repeatelem = function(elem, n){
    // returns an array with element elem repeated n times.
    var arr = [];

    for (var i = 0; i <= n; i++) {
        arr = arr.concat(elem);
    };

    return arr;
};
4

26 に答える 26

1057

ES6 で Array fill()メソッドを使用

console.log(
  Array(5).fill(2)
)
//=> [2, 2, 2, 2, 2]

于 2015-12-05T11:31:52.587 に答える
69

次のように実行できます。

function fillArray(value, len) {
  if (len == 0) return [];
  var a = [value];
  while (a.length * 2 <= len) a = a.concat(a);
  if (a.length < len) a = a.concat(a.slice(0, len - a.length));
  return a;
}

反復ごとに配列を 2 倍にするため、数回の反復で非常に大きな配列を作成できます。


注:pushの代わりに を使用するとconcatconcat反復ごとに新しい配列が作成されるため、関数を大幅に改善することもできます。このように (配列を操作する方法の例として示されています):

function fillArray(value, len) {
  var arr = [];
  for (var i = 0; i < len; i++) {
    arr.push(value);
  }
  return arr;
}
于 2012-09-19T21:34:12.933 に答える
36

配列を繰り返す必要がある場合は、次を使用します。

Array(3).fill(['a','b','c']).flat() 

戻ります

Array(9) [ "a", "b", "c", "a", "b", "c", "a", "b", "c" ]
于 2020-05-13T11:47:46.427 に答える
13

次のように Array の機能を拡張することもできます。

Array.prototype.fill = function(val){
    for (var i = 0; i < this.length; i++){
        this[i] = val;
    }
    return this;
};
// used like:
var arry = new Array(5)​.fill(2);
// or
var arry = new Array(5);
arry.fill(2);


​console.log(arry);​ //[2, 2, 2, 2, 2] 

サードパーティのライブラリを使用している場合、組み込みオブジェクトの機能を拡張すると問題が発生する可能性があることに注意してください。常にこれを考慮して決定してください。

于 2012-09-19T21:49:07.403 に答える
10

Node.js REPL:

> Array.from({length:5}).map(x => 2)
[ 2, 2, 2, 2, 2 ]
于 2019-09-10T12:21:32.650 に答える
6

配列を数回繰り返す必要がある場合:

var arrayA = ['a','b','c'];
var repeats = 3;
var arrayB = Array.apply(null, {length: repeats * arrayA.length})
        .map(function(e,i){return arrayA[i % arrayA.length]});
// result: arrayB = ['a','b','c','a','b','c','a','b','c']

この答えに触発されて

于 2015-04-10T09:54:03.927 に答える
5

簡単な方法はありません。ループを作成し、要素を配列にプッシュする必要があります。

于 2012-09-19T21:29:00.447 に答える
2

この関数は、(値) が整数または整数の文字列である限り、各要素が (値) に等しい (長さ) 要素の配列を作成します。10 進数は切り捨てられます。10 進数が必要な場合は、「parseInt(」を「parseFloat(」に置き換えます。

function fillArray(length, intValue) {
     var vals = (new Array(length + 1)).join(intValue + '|').split('|').slice(0,length);
     for(var i = 0; i < length; i += 1) {
         vals[i] = parseInt(vals[i]);
     }
     return vals;
}

例:

fillArray(5, 7) // returns [7,7,7,7,7]
fillArray(5, 7.5) // returns [7,7,7,7,7]
fillArray(5, 200) // returns [200,200,200,200,200]
于 2013-04-25T05:20:26.173 に答える
2

今日、ループを使用せずに 2D 配列を作成しようとしているときに、これを発見しました。振り返ってみると、新しい配列に参加するのは素晴らしいことです。新しい配列をマッピングしようとしましたが、マップが空のスロットをスキップするため機能しません。

"#".repeat(5).split('').map(x => 0)

「#」文字は、任意の有効な単一文字にすることができます。5 は、必要な要素の数の変数になります。7 は、配列に入力する値です。

新しい fill メソッドの方が優れています。これをコーディングしたときは、その存在を知りませんでしたし、repeat が es6 であることも知りませんでした。このトリックを reduce と併用してクールなことを行う方法についてのブログ投稿を書く予定です。

http://jburger.us.to/2016/07/14/functionally-create-a-2d-array/

于 2016-07-14T19:56:02.440 に答える
2

別のワンライナー:

Array.prototype.map.call([]+Array(5+1),function(){ return '2'; })
于 2014-06-23T12:34:47.383 に答える