2013-11-26 16 views
17

Qual è il modo più efficiente per creare un array JavaScript riempito a zero di lunghezza arbitraria?Come creare un array JavaScript riempito a zero di lunghezza arbitraria?

+1

C'è qualche ragione per cui si desidera riempire a zero invece di un array di X riempito con 'indefinito' che può essere facilmente dichiarato come' nuovo Array (x) 'dove' x' è intero compreso tra 0 e 2^32 - 1. –

+0

Una volta ho fatto una domanda molto simile, e ho trovato molte buone risposte: http://stackoverflow.com/questions/17776149/is-there-a-more-concise-way-to-initialize-empty-multidimensional -array –

+3

possibile duplicato di [Il modo più efficiente per creare un array JavaScript riempito a zero?] (http://stackoverflow.com/questions/1295584/most-efficient-way-to-create-a-zero-filled-javascript- array) –

risposta

17

ne dite di provare in questo modo:

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

o

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

EDIT: -

Se l'array è dinamico quindi è sufficiente che mettere in una funzione che prende un numero e sostituisci 10 con quella variabile.

+0

la mia lunghezza dell'array è dinamica – user2814799

+1

appena messo in una funzione che prende un numero e sostituisce 10 con quella variabile! – Shryme

+0

@Shryme: - Grazie. L'ho aggiornato anche nella mia risposta! –

1

Un modo potrebbe utilizzare la ricorsione.

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

avevo anche inviato un più classico un'opzione:

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

Per impostazione predefinita Uint8Array, Uint16Array e Uint32Array classi mantenere zeri come è valori, in modo da non avete bisogno di tutte le tecniche di riempimento complessi , proprio:

var ary = new Uint8Array(10); 

tutti gli elementi dell'array ary saranno zeri di default.

4

Se si desidera una matrice di 9-length:

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

Se si desidera un array di X-length:

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

Se si dispone di un array e vogliono riscrivere i suoi valori:

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

È possibile riempire l'array con qualsiasi cosa si desideri, semplicemente modificando il valore su ritorno all'interno funzione all'interno .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;}) 

L'ultimo riempirà la matrice con indefinito

2

Ho testato sia l'Unit8Array

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

e il join/split method

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

in jsPerf con risultati interessanti. Chrome e Firefox erano piuttosto lenti su entrambi i fronti (tra 48.000 e 76.000 operazioni). Ma Opera e Safari hanno entrambi funzionato incredibilmente bene con la funzione Uint8Array (fino a 438.000 operazioni). Penso che inizierò a usare Uint8Array e spero che Chrome e Firefox migliorino.

9

Le nuove estensioni di array ES6 consentono di eseguire questa operazione in modo nativo con il metodo fill.Ora IE edge, Chrome e FF lo supporta, ma controlla il compatibility table

new Array(3).fill(0) ti darà [0, 0, 0]. È possibile riempire l'array con qualsiasi valore come new Array(5).fill('abc') (anche oggetti e altri array).

In cima a quello è possibile modificare gli array precedenti con riempimento:

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

che ti dà: [1, 2, 3, 9, 9, 6]

+0

Chiaramente il modo migliore e più semantico! – Casimir

3

in JavaScript ES6 c'è una soluzione molto semplice. Sono venuto qui perché sto cercando di codegolf più breve:

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

 
console.log(a)

0

Che dire di questo?

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

È molto semplice, elegante ed è possibile riempire array con qualsiasi valore.

Problemi correlati