2013-11-26 43 views
17

創建任意長度的零填充JavaScript數組的最有效方法是什麼?如何創建任意長度的零填充JavaScript數組?

+1

是否有任何理由你想要零填充,而不是一個充滿「undefined」的X長度數組,它可以很容易地聲明爲'new Array(x)',其中'x'是0到2之間的整數^ 32 - 1. –

+0

我曾經問過一個非常類似的問題,並且我發現了很多很好的答案:http://stackoverflow.com/questions/17776149/is-there-a-more-concise-way-to-initialize-empty-multidimensional -arrays –

+3

[最有效的方法來創建一個零填充的JavaScript數組?]的可能的副本(http://stackoverflow.com/questions/1295584/most-efficient-way-to-create-a-zero-filled-javascript- array) –

回答

17

如何嘗試這樣的:

Array.apply(null, new Array(10)).map(Number.prototype.valueOf,0); 
//Output as [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 

new Array(10+1).join('0').split('').map(parseFloat) 
//Output as [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 

編輯: -

如果陣列是動態的,然後簡單地把在這需要一個數的函數並用該變量替換10。

+0

我的數組長度是動態的 – user2814799

+1

只是把它放在一個函數中,該函數需要一個數字並用該變量替換10! – Shryme

+0

@Shryme: - 謝謝。我也在我的回答中更新了這一點! –

1

一種方法可以使用遞歸。

function fillArray(l, a) { 
    a = a || []; 
    if (0 < l) { 
    l -= 1; 
    a[l] = 0; 
    return fillArray(l, a); 
    } 
    return a; 
} 

我還公佈了更多經典的選擇:

function fillArray(l) { 
    var a; 
    for (a = []; 0 < l; l-=1, a[l]=0); 
    return a; 
} 
6
function repeatArray(value, len){ 
    var A=[],i=0; 
    while (i<len) A[i++]= value; 
    return A; 
} 
15

默認情況下Uint8Array,​​和Uint32Array類保持爲零,因爲它的價值,所以你不需要任何複雜的灌裝技術,只是:

var ary = new Uint8Array(10); 

array的所有元素ary默認爲零。

4

如果希望9長度的數組:

Array.apply(null, {length: 9}).map(function() {return 0;}) 

如果希望X長度的數組:

Array.apply(null, {length: X}).map(function() {return 0;}) 

如果有一個數組和要重寫其值:

var arr=[54,53,6,7,88,76] 
arr=arr.map(function() {return 0;}) 

你可以用你想要的任何東西來填充數組,只需改變返回的值內部功能內部.MAP

Array.apply(null, {length: 9}).map(function() {return "a string";}) 
Array.apply(null, {length: 9}).map(function() {return Math.random();}) 
Array.apply(null, {length: 9}).map(function() {return NaN;}) 
Array.apply(null, {length: 9}).map(function() {return null;}) 
Array.apply(null, {length: 9}).map(function() {return true;}) 
Array.apply(null, {length: 9}).map(function() {return;}) 

最後一個將填充陣列未定義

2

我測試兩個Unit8Array

[].slice.apply(new Uint8Array(n)); 

和加入/拆分法

new Array(n + 1).join('0').split('').map(parseFloat); 

jsPerf與有趣的結果。 Chrome和Firefox在這兩方面都相當緩慢(在48,000到76,000次操作之間)。但Opera和Safari在Uint8Array功能方面做得非常出色(高達438,000次操作)。我想我會開始使用Uint8Array,並希望Chrome和Firefox改進。

9

新的ES6陣列擴展允許您使用fill方法本地執行此操作。現在IE邊緣,Chrome和FF支持它,但檢查compatibility table

new Array(3).fill(0)會給你[0, 0, 0]。您可以使用任何值填充陣列,如new Array(5).fill('abc')(即使對象和其他陣列)。

更重要的是,你可以修改以前的陣列,填充頂:

arr = [1, 2, 3, 4, 5, 6] 
arr.fill(9, 3, 5) # what to fill, start, end 

它給你:[1, 2, 3, 9, 9, 6]

+0

顯然是最好和最有語義的方式! – Casimir

3

在Javascript中ES6有一個很簡單的解決方案。我來到這裏是因爲我想codegolf更短:

n = 999 // arbitrary length 
 
a = Array(n).fill(0) 
 

 
console.log(a)

0

這個怎麼樣?

(new Array(123)).fill(0) 

這是非常容易,優雅,你可以用任何值填充數組。