2010-10-29 38 views

Trả lời

32
while(arraySize--) array.push(value); 

không khởi tạo (mà tôi biết)


Cập nhật

Từ bao giờ đăng câu trả lời này 4 năm về trước, người ta dường như giữ lại đến đây để này câu trả lời. Đối với mục đích đo điểm chuẩn, tôi đã thực hiện một số JSPerf với một số giải pháp khác nhau.

Giải pháp trên đây không phải là nhanh nhất, mặc dù nó ngắn. Để gắn bó với phong cách ngắn tương tự, nhưng với một hiệu suất tốt hơn:

while(size--) array[size] = value; 

Cập nhật tháng 2 năm 2016 Cập nhật các JSPerf với một phiên bản mới với nhiều testcases.

Nếu hiệu suất không quan trọng và bạn muốn có một one-liner:

var value = 1234, // can be replaced by a fixed value 
    size = 1000, // can be replaced by a fixed value 
    array = Array.apply(null,{length: size}).map(function() { return value; }); 

Một giải pháp performant hơn (trong một, dơ bẩn, dòng): Hãy nhận biết: đây thay thế existsing giá trị, kích thước và i biến trong phạm vi

for(var i = 0, value = 1234, size = 1000, array = new Array(1000); i < size; i++) array[i] = value; 
+0

Trong nhiều trường hợp, "arraySize" sẽ không thể thay đổi được (có thể là một hằng số hoặc theo nghĩa đen hoặc - tôi biết, thực hành không tốt - "array.length"). Bằng cách biểu diễn kích thước như một biến, tôi đã làm cho bit này không rõ ràng. – oldestlivingboy

+1

true: "cho (var i = arraySize; i--;) mảng.push (giá trị);" sau đó :-) nhưng tôi nghĩ rằng bạn đã tìm ra rằng đã được – DoXicK

+1

Bạn nói đúng - cú pháp đó làm tắt năm ký tự. ;-) – oldestlivingboy

1

Nếu bạn cần phải làm điều đó nhiều lần, bạn luôn có thể viết một hàm:

function makeArray(howMany, value){ 
    var output = []; 
    while(howMany--){ 
     output.push(value); 
    } 
    return output; 
} 

var data = makeArray(40, "Foo"); 

Và, chỉ cần cho đầy đủ (không quan trọng với nguyên mẫu được xây dựng trong các đối tượng là thường không phải là một ý tưởng tốt):

Array.prototype.fill = function(howMany, value){ 
    while(howMany--){ 
     this.push(value); 
    } 
} 

Vì vậy, bạn có thể:

var data = []; 
data.fill(40, "Foo"); 

Cập nhật : Tôi vừa xem ghi chú của bạn về số arraySize là hằng số hoặc theo nghĩa đen. Nếu vậy, chỉ cần thay thế tất cả while(howMany--) bằng cũ for(var i=0; i<howMany; i++) cũ.

2

Để đạt hiệu quả, tôi sẽ tránh push. Vì vậy, chỉ đơn giản là

for (var i = 0; i < arraySize; i++) array[i] = value; 

Đối với IE10:

array = new Array(arraySize); 
for (var i = 0; i < arraySize; i++) array[i] = value; 

Edit: sửa đổi như đã thảo luận trong các ý kiến.

+0

'cho (var i = 0; i Triang3l

+0

Có, nhưng việc cấp phát bộ nhớ cho 'mảng' hiệu quả hơn là bắt đầu' mảng [0] '. –

+1

No. Nếu bạn bắt đầu khởi tạo một mảng từ đầu, bảng băm sẽ được sử dụng trong nội bộ, nhưng nếu bạn bắt đầu khởi tạo một mảng từ 0, và bạn chỉ có các chỉ mục tuần tự, một mảng thực sẽ được sử dụng (ít nhất là trong V8). JavaScript không phân bổ các phần tử (high_index + 1), nó chỉ phân bổ các phần tử được khởi tạo. – Triang3l

9

OP có vẻ như sau khi nén trong một kịch bản sử dụng một lần về hiệu quả và khả năng sử dụng lại. Đối với những người khác đang tìm kiếm hiệu quả, đây là một tối ưu hóa chưa được đề cập. Vì bạn biết độ dài của mảng trước, hãy tiếp tục và đặt trước khi gán giá trị. Nếu không, các mảng sẽ được thay đổi kích thước nhiều lần trên bay - không lý tưởng!

function initArray(length, value) { 
    var arr = [], i = 0; 
    arr.length = length; 
    while (i < length) { arr[i++] = value; } 
    return arr; 
} 

var data = initArray(1000000, false); 
+1

Trong JavaScript, 'for' nhanh gấp 2 lần' while'. – Triang3l

+2

Tôi sẽ không nói chính xác như sau: http://www.stoimen.com/blog/2012/01/24/javascript-performance-for-vs-while/ Chắc chắn bạn sẽ không muốn luôn sử dụng độc quyền - đánh bại mục đích của họ. Nó sẽ là công việc của trình biên dịch/biên dịch để tăng tốc độ nó lên nơi nó có thể, không phải của bạn. Nhưng ngay cả điều đó không phải lúc nào cũng đúng. –

5

này không có khả năng là tốt hơn so với bất kỳ các kỹ thuật trên nhưng nó là thú vị ...

var a = new Array(10).join('0').split('').map(function(e) {return parseInt(e, 10);}) 
7

Đây không phải là nhỏ gọn nhưng được cho là trực tiếp hơn.

array = Array.apply(null, new Array(arraySize)).map(function() {return value;}); 
52

Một cách ngắn để làm việc đó sẽ là:

var arr = Array(arraySize).fill(value); 

Sẽ làm arr = Array [ 0, 0, 0, 0, 0 ] nếu arraySize == 5value == 0, ví dụ.

+0

Không được hỗ trợ trên IE: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/fill#Browser_compatibility – Perry

+10

@Perry. Bạn biết đấy, khi trình duyệt với 6% thị trường không hỗ trợ tiêu chuẩn thì vấn đề của trình duyệt đó là – Slava

+3

Hãy cẩn thận với hàm điền nếu giá trị là một đối tượng, bởi vì bạn có thể có cùng một đối tượng trong toàn bộ mảng, có thể gây ra kết quả không mong muốn. – Gregzenegair

0

Tình cờ gặp vấn đề này trong khi khám phá các phương thức mảng trên mặt phẳng .. ohhh những nơi chúng ta đi khi chúng ta đang buồn chán. :)

var initializedArray = new Array(30).join(null).split(null).map(function(item, index){ 
    return index; 
}); 

.map()null để giành chiến thắng! Tôi thích null bởi vì đi qua trong một chuỗi như lên đầu với '0' hoặc bất kỳ giá trị khác là khó hiểu. Tôi nghĩ điều này rõ ràng hơn là chúng tôi đang làm một điều gì đó khác biệt.

Lưu ý rằng .map() bỏ qua các giá trị không được khởi tạo. Đây là lý do tại sao new Array(30).map(function(item, index){return index}); không hoạt động. Phương thức .fill() mới được ưu tiên nếu có, tuy nhiên, cần lưu ý hỗ trợ trình duyệt là 8/23/2015.

Desktop (hỗ trợ cơ bản)

  • Chrome 45 (36 1)
  • Firefox (Gecko) 31 (31)
  • Internet Explorer Không hỗ trợ
  • Opera Không hỗ trợ
  • Safari 7.1

Từ MDN: [? Cách hiệu quả nhất để tạo ra một điền mảng JavaScript zero]

[1, 2, 3].fill(4);    // [4, 4, 4] 
[1, 2, 3].fill(4, 1);   // [1, 4, 4] 
[1, 2, 3].fill(4, 1, 2);   // [1, 4, 3] 
[1, 2, 3].fill(4, 1, 1);   // [1, 2, 3] 
[1, 2, 3].fill(4, -3, -2);  // [4, 2, 3] 
[1, 2, 3].fill(4, NaN, NaN);  // [1, 2, 3] 
Array(3).fill(4);    // [4, 4, 4] 
[].fill.call({ length: 3 }, 4); // {0: 4, 1: 4, 2: 4, length: 3} 
-1
var a=Array(100).join("|").split("|").map(Number); 
Các vấn đề liên quan