2013-11-26 6 views
17

Каков наиболее эффективный способ создания нулевого заполненного массива JavaScript произвольной длины?Как создать нулевой заполненный массив JavaScript произвольной длины?

+1

Есть ли какая-либо причина, по которой вы хотите заполнить нуль, а не массив длины X, заполненный «undefined», который легко может быть объявлен как «новый массив (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] 

EDIT: -

Если массив является динамическим, то просто положить, что в функцию, которая принимает ряд и замените 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, Uint16Array и Uint32Array классы сохранить нули, как это ценности, так что вам не нужны никакие сложные методы заполнения , just:

var ary = new Uint8Array(10); 

все элементы массиваПо умолчаниюбудет нулями.

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;}) 

Вы можете заполнить массив тем, что хотите, просто изменив значение на return внутри функция внутри .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 edge, 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) 

Это очень простой, элегантный и вы можете заполнить массив любой ценностью.

Смежные вопросы