2016-02-23 2 views
10

小さな質問です。私は少しいじるして、yの値が何であれば、その配列のすべての要素がこれがうまく機能オブジェクトを持つArray.prototype.fill()は、新しいインスタンスではなく参照を渡します。

var arr = new Array(x).fill(y); 

値yに初期化されな長さxの新しい配列を、インスタンス化しようとしていた

以外のオブジェクト。 yは 意味がオブジェクトで、以下は真である:

var arr = new Array(2).fill({}); 
arr[0] === arr[1]; //is true; 
arr[0].test = 'string'; 
arr[1].test === 'string'; //is also true; 

はフィル機能を使用しながら、新しいオブジェクトは、各要素のために作成されるべきであると述べるにする方法はありますか?それとも、ループに変換する必要がありますか?

ありがとうございます!

答えて

16

あなたが最初fill任意の値(例えばundefined)を配列し、次にあなたがmapを使用することができますすることができます

var arr = new Array(2).fill().map(u => ({})); 
var arr = new Array(2).fill().map(Object); 
+0

ありがとうございます!意味をなさない! –

+0

'Array.from({length:2}、u =>({}))' – Slai

4

受け入れ答えは良いですが、90%で動作します症例の

しかし、あなたは、高性能JSアプリケーションを作っている、とあなたは大きな/巨大な配列を扱う場合は、Array.mapは(..)過負荷の両方に大きな作成した場合 - それは作成して、メモリとプロセッサの使用を配列のコピー。

  • 提案の回答(11X倍!!!遅い):

    私はループのための古典的なを使用することをお勧めします。これを私は3つの選択肢をテストし

    a = new Array(ARRAY_SIZE); 
        for (var i = 0; i < ARRAY_SIZE; i++) { 
         a[i] = []; 
        } 
    

    となりました。

    a = new Array(ARRAY_SIZE).fill().map(u => { return []; }); 
    
  • 単純なループ(最速):

    a = new Array(ARRAY_SIZE); 
    for (var i = 0; i < ARRAY_SIZE; i++) { 
        a[i] = []; 
    } 
    
  • のforEach(2X時間遅い):

    a = new Array(ARRAY_SIZE).fill(); 
    a.forEach((val, i) => { 
        a[i] = []; 
    }) 
    

PS。私はthis fiddleをテストに使った。

関連する問題