web-dev-qa-db-ja.com

同じ要素を複数回繰り返して配列を作成する

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

[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;
};
226
Curious2learn

あなたはこれのようにそれをすることができます:

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は繰り返しごとに新しい配列を作成するため、concatの代わりにconcatを使用することで関数を大幅に改善することもできます。このようにしてください(配列を扱う方法の例として示されています)。

function fillArray(value, len) {
  var arr = [];
  for (var i = 0; i < len; i++) {
    arr.Push(value);
  }
  return arr;
}
49
Guffa

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

Array(5).fill(2)
//=> [2, 2, 2, 2, 2]
482
>>> Array.apply(null, Array(10)).map(function(){return 5})
[5, 5, 5, 5, 5, 5, 5, 5, 5, 5]
>>> //Or in ES6
>>> [...Array(10)].map((_, i) => 5)
[5, 5, 5, 5, 5, 5, 5, 5, 5, 5]
132
Janus Troelsen

あなたが試すことができます:

Array(6).join('a').split(''); // returns ['a','a','a','a','a'] (5 times)

更新(01/06/2018):

これで、一連の文字を繰り返すことができます。

new Array(5).fill('a'); // give the same result as above;
// or
Array.from({ length: 5 }).fill('a')

注:互換性とブラウザーのサポートについては、 fill(...) および from(...) についてさらに調べてください。

65
Vivek

Array.from({length:5}, i => 1) // [1, 1, 1, 1, 1]

または値を大きくして配列を作成する

Array.from({length:5}, (e, i)=>i) // [0, 1, 2, 3, 4]

31
Thomson

lodash では、それほど悪くありません。

_.flatten(_.times(5, function () { return [2]; }));
// [2, 2, 2, 2, 2]

EDIT:さらに良いこと:

_.times(5, _.constant(2));
// [2, 2, 2, 2, 2]

EDIT:さらに良いこと:

_.fill(Array(5), 2);
29
Droogans

[c] * nは次のように書くことができます。

Array(n+1).join(1).split('').map(function(){return c;})

[2] * 5について

Array(6).join(1).split('').map(function(){return 2;})
14
brook hong

また、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] 

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

10
Shmiddty

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

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

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']

に触発 この答え

3

もう一つのワンライナー:

Array.prototype.map.call([]+Array(5+1),function(){ return '2'; })
2
Filip Hermans

この関数は、(value)が整数または整数の文字列である限り、各要素が(value)に等しい(length)要素の配列を作成します。 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]
1
TxRegex

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

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

"#"文字は任意の有効な単一文字にすることができます。 5はあなたが望む要素の数の変数になるでしょう。 7は、あなたがあなたの配列を満たしたい値になるでしょう。

新しいfillメソッドはより優れています、そして私がこれをコーディングしたとき私はそれが存在することを知りませんでしたし、また繰り返しがes6であることを知りませんでした。私はクールなことをするためにreduceと並行してこのトリックを使うことについてのブログ記事を書くつもりです。

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

1
Magical Gordon

この機能を使用します。

function repeatElement(element, count) {
    return Array(count).fill(element)
}
>>> repeatElement('#', 5).join('')
"#####"

または、よりコンパクトなバージョンの場合:

const repeatElement = (element, count) =>
    Array(count).fill(element)
>>> repeatElement('#', 5).join('')
"#####"

または、カレー対応バージョンの場合:

const repeatElement = element => count =>
    Array(count).fill(element)
>>> repeatElement('#')(5).join('')
"#####"

この関数はリストで使用できます:

const repeatElement = (element, count) =>
    Array(count).fill(element)

>>> ['a', 'b', ...repeatElement('c', 5)]
['a', 'b', 'c', 'c', 'c', 'c', 'c']
1
Ken Mueller
var finalAry = [..."2".repeat(5).split("")].map(Number);
console.log(finalAry);
1
Amaldev ps

私はのような配列を使用するとき、私は言及された方法で問題を抱えていた

var array = ['foo', 'bar', 'foobar'];
var filled = array.fill(7);

//filled should be ['foo', 'bar', 'foobar', 'foo', 'bar', 'foobar', 'foo']

これを取得するには、私が使っています:

Array.prototype.fill = function(val){
    var l = this.length;
    if(l < val){
        for(var i = val-1-l; i >= 0; i--){
            this[i+l] = this[i % l];
        }
    }
    return this;
};
1
Xaver

Vivek's answer を改善すると、これは任意の長さの文字列に対して機能し、長さnの配列を生成します。Array(n+1).join('[string to be repeated][separator]').split('[separator]').slice(0, n)

0
Tigregalis

ワンライナーとしても使用できます。

function repeat(arr, len) {
    while (arr.length < len) arr = arr.concat(arr.slice(0, len-arr.length));
    return arr;
}
0
Hai Phan

これを試して:

"avinash ".repeat(5).trim().split(" ");
0
Avinash

あなたがlodash/underscoreのようなユーティリティベルトを使っているなら、あなたはこのようにそれをすることができます:)

let result = _.map(_.times(foo), function() {return bar})
0
Shane Rogers