2013-07-21 40 views
14

Tôi đã cố gắng tìm một cách hợp lý để đặt kích thước của một mảng JavaScript đa chiều rỗng, nhưng không thành công cho đến nay.Có cách nào ngắn gọn hơn để khởi tạo các mảng đa chiều trống không?

Trước tiên, tôi đã cố gắng khởi tạo một mảng 10x10x10 trống bằng cách sử dụng var theArray = new Array(10, 10 10), nhưng thay vào đó, nó chỉ tạo mảng 1 chiều với 3 phần tử.

Tôi đã tìm ra cách khởi tạo một mảng 10x10x10 trống bằng cách sử dụng các vòng lặp lồng nhau, nhưng nó rất tẻ nhạt để viết bộ khởi tạo mảng theo cách này. Việc khởi tạo các mảng đa chiều bằng cách sử dụng các vòng lặp lồng nhau có thể khá tẻ nhạt: có cách nào ngắn gọn hơn để thiết lập kích thước của các mảng đa chiều rỗng trong JavaScript (với nhiều thứ nguyên tùy ý) không?

//Initializing an empty 10x10x10 array: 
var theArray = new Array(); 
for(var a = 0; a < 10; a++){ 
    theArray[a] = new Array(); 
    for(var b = 0; b < 10; b++){ 
     theArray[a][b] = new Array(); 
     for(var c = 0; c < 10; c++){ 
      theArray[a][b][c] = 10 
     } 
    } 
} 

console.log(JSON.stringify(theArray)); 
+0

Các ngôn ngữ lập trình Java có 'int [] [] thứ = new int [10] [10] ', nhưng tôi không biết về bất kỳ cấu trúc tương tự nào trong JavaScript. –

+0

bản sao có thể có của [Làm cách nào tôi có thể tạo mảng hai chiều trong JavaScript?] (Http://stackoverflow.com/questions/966225/how-can-i-create-a-two-dimensional-array-in-javascript) – Lion

+2

@Lion Không, câu hỏi này là hỏi làm thế nào để khởi tạo mảng tùy ý nhiều kích thước, không chỉ 2 kích thước. –

Trả lời

6

Phỏng theo this answer:

function createArray(length) { 
    var arr = new Array(length || 0), 
     i = length; 

    if (arguments.length > 1) { 
    var args = Array.prototype.slice.call(arguments, 1); 
    while(i--) arr[i] = createArray.apply(this, args); 
    }   
    return arr; 
} 

Đơn giản chỉ cần gọi với một đối số cho chiều dài của mỗi chiều. Ví dụ sử dụng:

  • var multiArray = createArray(10,10,10); Cung cấp mảng 3 chiều có độ dài bằng nhau.
  • var weirdArray = createArray(34,6,42,2); Cung cấp mảng 4 chiều có độ dài không bằng nhau.
+1

+1 để sử dụng slice – raam86

+0

bạn có thể đơn giản hóa 'while' của bạn bằng cách sử dụng một trong tôi đã làm trong câu trả lời của tôi – naomik

+0

đẹp !! giải pháp tốt cho một vấn đề tốt –

1

Đây là quan điểm của tôi về vấn đề này: nArray tiện ích chức năng

function nArray() { 
    var arr = new Array(); 
    var args = Array.prototype.slice.call(arguments, 1); 
    for(var i=0;i<arguments[0];i++) { 
     arr[i] = (arguments.length > 1 && nArray.apply(this, args)) || undefined; 
    } 
    return arr; 
} 

Cách sử dụng Ví dụ:

var arr = nArray(3, 3, 3); 

Kết quả trong 3x3x3 mảng các giá trị không xác định.

Chạy mã với một số xét nghiệm cũng có sẵn như là một Fiddle ở đây: http://jsfiddle.net/EqT3r/7/

3
function multiDimArrayInit(dimensions, leafValue) { 
    if (!dimensions.length) { 
     return leafValue; 
    } 
    var arr = []; 
    var subDimensions = dimensions.slice(1); 
    for (var i = 0; i < dimensions[0]; i++) { 
     arr.push(multiDimArrayInit(subDimensions, leafValue)); 
    } 
    return arr; 
} 


console.log(multiDimArrayInit([2,8], "hi")); // counting the nested "hi"'s yields 16 of them 

bản demo http://jsfiddle.net/WPrs3/

+0

Công việc tốt, hai nitpicks nhỏ: callee không được chấp nhận và tốt hơn là di chuyển slice ra khỏi vòng lặp. – georg

+0

@ thg435 điểm tốt – goat

0

Kích thước hơn bạn có, càng có nhiều bạn có quan tâm trong việc sử dụng một mảng phẳng duy nhất và một getter/setter chức năng cho mảng của bạn.
Bởi vì đối với [d1 X d2 X d3 X .. X dn] bạn sẽ tạo các mảng d2 * d3 * ... * dn thay vì một, và khi truy cập, bạn sẽ tạo ra n indirection thay vì 1.

giao diện sẽ như thế nào:

var myNArray = new NArray(10,20,10); 
var oneValue = myNArray.get(5,8,3); 
myNArray.set(8,3,2, 'the value of (8,3,2)'); 

việc thực hiện phụ thuộc vào sở thích của bạn cho một kích thước cố định mảng n-dimensionnal hoặc một mảng có thể đẩy/pop và những thứ tương tự.

0

Một phiên bản gọn gàng hơn của @ Chris mã:

function multiDim (dims, leaf) { 
    dims = Array.isArray (dims) ? dims.slice() : [dims]; 
    return Array.apply (null, Array (dims.shift())).map (function (v, i) { 
    return dims.length 
     ? multiDim (dims, typeof leaf == 'string' ? leaf.replace ('%i', i + ' %i') : leaf) 
     : typeof leaf == 'string' ? leaf.replace ('%i', i) : leaf; 
    });  
} 

console.log (JSON.stringify (multiDim ([2,2], "hi %i"), null, ' ')); 

Tạo:

[ 
    [ 
    "hi 0 0", 
    "hi 0 1" 
    ], 
    [ 
    "hi 1 0", 
    "hi 1 1" 
    ] 
] 

Trong phiên bản này bạn có thể vượt qua các đối số đầu tiên như một số cho mảng chiều duy nhất. Bao gồm %i trong giá trị lá sẽ cung cấp giá trị chỉ mục trong các giá trị lá.

Chơi với nó tại địa chỉ: http://jsfiddle.net/jstoolsmith/r3eMR/

0

chức năng Rất đơn giản, tạo ra một mảng với bất kỳ số lượng kích thước. Xác định độ dài của mỗi kích thước và nội dung mà đối với tôi là '' thường

function arrayGen(content,dims,dim1Len,dim2Len,dim3Len...) { 
    var args = arguments; 
    function loop(dim) { 
    var array = []; 
    for (var a = 0; a < args[dim + 1]; a++) { 
     if (dims > dim) { 
     array[a] = loop(dim + 1); 
     } else if (dims == dim) { 
     array[a] = content; 
     } 
    } 
    return array; 
    } 
    var thisArray = loop(1); 
    return thisArray; 
}; 

tôi sử dụng chức năng này rất thường xuyên, nó giúp tiết kiệm rất nhiều thời gian

Các vấn đề liên quan