2014-03-19 54 views
6

我想這與數組填充類似,但我想知道它是否可以簡化。JavaScript:如何將x添加到數組x次?

var arr = [1,2,3], 
    x = 5; 

for (var i=0; i<x; i++) { 
    arr.push(x); 
} 

console.log(arr); 
//=> [1, 2, 3, 5, 5, 5, 5, 5] 

有沒有辦法做到這一點,而不使用for循環?


更新

即使有發聰明解決方案,for循環似乎是最高效的

array-fill-2Benchmarks on jsperf

回答

3

除非你得到懲罰的每一行你寫的代碼,代碼很好:簡潔而且非常容易理解。

如果得到懲罰,只需使用:

for (var i = 0; i < x; i++) arr.push(x); 

在一行:-)

除此之外,你最好的選擇是沿着線功能:

arr = appendXCopiesOfX (arr, x); 

但我不認爲你真的在那裏獲得任何東西,因爲如前所述,理解這樣一個小的l應該有很小的問題接力。

總而言之,這可能是浪費時間和精力來改善你目前的狀況。

+0

+1爲務實。很容易想要在無意義的優化中結束。 – naomik

+0

我在我原來的問題中添加了基準 – naomik

4

沒有循環:

var arr = [1,2,3], x = 5; 
arr = arr.concat(Array.apply(null, Array(x)).map(function() { return x; })); 

// or even 
arr = arr.concat(Array.apply(null, Array(x)).map(x.valueOf, x)); 
+2

OMG!這就是我所能說的:-) – paxdiablo

+0

眩目炫目!這很漂亮,但我想它在性能上會受到很大的影響...... – naomik

+0

我認爲'.map(x.valueOf,x)'在這裏可能略有改進 – naomik

1

對於使用ES6和所遇到這個問題的。嘗試使用Array.fill()https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/fill

我在測試中使用此方法來生成x行的模擬數據,而無需循環。

編輯:對不起,我在這一個關閉。此代碼將生成一個數組x長,但它們都具有相同的值。在這篇文章的末尾有一個更好的代碼片段。

newOrdersX: function(x) { 
    return Array(x).fill({ 
    name: faker.random.name() 
    }); 
}` 

這一個將是一個x長度的數組,但每個值都會不同。請注意,.fill()仍然需要調用,否則將無法工作。

newOrdersX: function(x) { 
    return Array(x).fill().map(() => ({ 
    name: faker.random.name() 
    })); 
}`