JavaScript로 2 차원 배열을 만들려면 어떻게해야합니까?


1136

나는 온라인에서 읽었으며 일부 장소는 불가능하다고 말하고 일부는 예라고 말하고 다른 사람들은 예를 반박합니다.

  1. JavaScript로 2 차원 배열을 어떻게 선언합니까? (가능하다고 가정)

  2. 회원에게 어떻게 액세스합니까? ( myArray[0][1]또는 myArray[0,1]?)


21
다소 정의적인 정의를 가정하면 자바 스크립트로 2D 배열을 만드는 것은 기술적으로 불가능합니다. 그러나 동일한 배열 배열을 만들 수 있습니다.
IJ 케네디

10
참고로 ...을 사용하여 더 많은 배열로 배열을 채울 때 var arr2D = new Array(5).fill(new Array(3));Array (5)의 각 요소는 동일한 Array (3)을 가리 킵니다. 따라서 for 루프를 사용하여 하위 배열을 동적으로 채우는 것이 가장 좋습니다.
Josh Stribling

51
a = Array(5).fill(0).map(x => Array(10).fill(0))
Longfei Wu

2
다시 말해, 람다 식이나 Longfei Wu의 주석과 같은 배열이 아니므로 처음에 배열을 0으로 채우고 맵 함수를 람다로 사용하기 때문에 채워지는 배열의 각 인덱스를 fill호출하지 않습니다. new Array(3)각 요소를 새로운 배열로 채 웁니다. fill 함수는 배열을 사용자가 말한대로 정확하게 채 웁니다. 말이 돼? 에 대한 추가 정보를 원하시면 map기능을 참조하십시오 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
조쉬 Stribling

2
@kalehmann이 잘입니다 meta.stackoverflow.com/a/252017/2311074 If the new question is a better question or has better answers, then vote to close the old one as a duplicate of the new one.
아담

답변:


1231

var items = [
  [1, 2],
  [3, 4],
  [5, 6]
];
console.log(items[0][0]); // 1
console.log(items[0][1]); // 2
console.log(items[1][0]); // 3
console.log(items[1][1]); // 4
console.log(items);


32
이 방법으로 큰 다차원 배열을 초기화하는 것은 어려울 것입니다. 그러나이 함수 를 사용하여 치수를 매개 변수로 지정하여 빈 다차원을 작성할 수 있습니다.
Anderson Green

2
@AndersonGreen 다차원 배열 솔루션에 관심이있는 사람들을위한 링크를 언급 한 것이 좋지만, 질문과 Ballsacian1의 대답은 "다중 배열"배열이 아니라 "2D"배열에 관한 것입니다.
evilReiko

당신은 모든 것을 겪어야합니다 ... 예 : alert (items [0] [1]); // 2 등
Dois

1
@SashikaXP, 이것은 0 이외의 첫 지수에는 적용되지 않습니다.
Michael Franzl

1
문제는 2 차원 배열을 선언하는 방법입니다. 어느 것이 내가 찾고 이것을 발견했으며 선언과 초기화의 차이점을 식별하지 못하는 다음 답변을 찾았습니다. 알려진 길이 또는 제한이없는 선언도 있으며, 어느 것도 논의되지 않습니다.
chris

444

단순히 배열 내의 각 항목을 배열로 만듭니다.

var x = new Array(10);

for (var i = 0; i < x.length; i++) {
  x[i] = new Array(3);
}

console.log(x);


6
키와 값에 문자열 같은 것을 사용할 수 있습니까? myArray [ 'Book'] [ 'item1']?
Diego

42
@Diego, 그렇습니다. 그러나 그것은 배열이 의도 한 것이 아닙니다. 키가 문자열 인 경우 객체를 사용하는 것이 좋습니다.
Matthew Crumley

10
동적 크기의 배열 (예 : 변수가있는 new Array(size)size)에 대해 구현 할 수 있기 때문에 허용 된 답변 보다이 예제가 더 좋습니다 .
Variadicism

1
작동하지 않습니다-할당 오류. 이 답변이 쓸모없는 경우 어떻게 280 좋아합니까?
Gargo

1
감사합니다. 당신은 예를 Gargo를 볼 수 있습니다 jsfiddle.net/matasoy/oetw73sj을
matasoy

198

activa의 답변과 유사하게 다음은 n 차원 배열을 만드는 함수입니다.

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[length-1 - i] = createArray.apply(this, args);
    }

    return arr;
}

createArray();     // [] or new Array()

createArray(2);    // new Array(2)

createArray(3, 2); // [new Array(2),
                   //  new Array(2),
                   //  new Array(2)]

2
이것이 4 차원 배열을 만들 수 있습니까?
trusktr

4
@trusktr : 그렇습니다. 메모리 제약 조건 내에서 원하는만큼 많은 차원을 만들 수 있습니다. 네 차원의 길이를 전달하십시오. 예를 들면 다음과 같습니다 var array = createArray(2, 3, 4, 5);.
Matthew Crumley

4
최고의 답변! 그러나 0 또는 1 매개 변수와 함께 사용하지 않는 것이 좋습니다 (무용)
Apolo

2
@BritishDeveloper 예. 이것은 각 길이가 5 인 5D 배열입니다.[[[[[null,null],[null,null]],[[null,null],[null,null]]],[[[null,null],[null,null]],[[null,null],[null,null]]]],[[[[null,null],[null,null]],[[null,null],[null,null]]],[[[null,null],[null,null]],[[null,null],[null,null]]]]]
haykam

2
@haykam 당신의 시간을 낭비해서 죄송합니다-나는 냉소적이었습니다 : /
BritishDeveloper

84

Javascript에는 1 차원 배열 만 있지만 다른 배열에서 지적한 것처럼 배열 배열을 작성할 수 있습니다.

고정 차원의 2 차원 배열을 구성하는 데 다음 함수를 사용할 수 있습니다.

function Create2DArray(rows) {
  var arr = [];

  for (var i=0;i<rows;i++) {
     arr[i] = [];
  }

  return arr;
}

열 수는 사용하기 전에 배열의 크기를 지정할 필요가 없기 때문에 실제로 중요하지 않습니다.

그런 다음 전화를 걸 수 있습니다.

var arr = Create2DArray(100);

arr[50][2] = 5;
arr[70][5] = 7454;
// ...

카드 한 벌을 나타내는 2 차원 배열을 만들고 싶습니다. 이는 카드 값을 보유한 다음 소송에 맞는 2 차원 배열입니다. 가장 쉬운 방법은 무엇입니까?
Doug Hauf

1
함수 Create2DArray (행) {var arr = []; for (var i = 0; i <rows; i ++) {arr [i] = []; } 반환 arr; } function print (deck) {for (t = 1; t <= 4; t ++) {for (i = 1; i <= 13; i ++) {document.writeln (deck [t] [i]); }}} fufilltion fillDeck (d) {for (t = 1; t <= 4; t ++) {myCardDeck [t] [1] = t; (i = 1; i <= 13; i ++)의 경우 {myCardDeck [t] [i] = i; }}} 함수 loadCardDeck () {var myCardDeck = Create2DArray (13); fillDeck (myCardDeck); 인쇄 (myCardDeck); }
Doug Hauf

2
@Doug : 실제로 2 개의 속성을 가진 1 차원 객체 배열을 원합니다. var deck = []; 갑판 [0] = {얼굴 : 1, 소송 : 'H'};
TeasingDart

@DougHauf 그것은 축소 된 2D 배열입니다 ?? : P : D
Mahi

78

가장 쉬운 방법 :

var myArray = [[]];

29
이것은 2 차원 배열입니다
Maurizio In denmark

15
그래, 조심해 myArray [0] [whatever]를 할당하는 것은 좋지만 myArray [1] [whatever]를 설정하고 시도하면 myArray [1]이 정의되지 않았다고 불평합니다.
Philip

22
당신은 설정해야 @Philip myArray[1]=[];할당하기 전에myArray[1][0]=5;
182764125216

4
주의, 이것은 않습니다 하지 @AndersonGreen가 쓴 "빈의 1x1 배열을 만듭니다." "1x0"배열을 만듭니다 (즉, 열이 0 인 배열을 포함하는 1 개의 행). myArray.length == 1그리고 myArray[0].length == 0. 그런 다음 "정말로 비어있는" "0x0"배열을 복사하면 잘못된 결과가 나타납니다.
JonBrave

3
그것은 나를 위해 오늘의 지식 이었다 . 감사합니다 :)
th3pirat3

76

빈 2 차원 배열을 만드는 방법 (한 줄)

Array.from(Array(2), () => new Array(4))

2와 4는 각각 1 차원과 2 차원입니다.

우리는 Array.from배열과 같은 매개 변수와 각 요소에 대한 선택적 매핑을 취할 수있는를 사용하고 있습니다.

Array.from (arrayLike [, mapFn [, thisArg]])

var arr = Array.from(Array(2), () => new Array(4));
arr[0][0] = 'foo';
console.info(arr);

동일한 트릭을 사용하여 1 ... N을 포함하는 JavaScript 배열만들 수 있습니다.


또는 (하지만 더 비효율적 인 12 % n = 10,000)

Array(2).fill(null).map(() => Array(4))

성능 저하는 실행하기 위해 첫 번째 차원 값을 초기화해야한다는 사실과 함께 발생합니다 .map. 그 기억 Array은을 통해 그것을 주문할 때까지 위치를 할당하지 않습니다 .fill또는 직접 값 할당.

var arr = Array(2).fill(null).map(() => Array(4));
arr[0][0] = 'foo';
console.info(arr);


후속 조치

다음은 올바르게 보이지만 문제 가있는 방법입니다 .

 Array(2).fill(Array(4)); // BAD! Rows are copied by reference

분명히 원하는 2 차원 배열 ( [ [ <4 empty items> ], [ <4 empty items> ] ])을 반환하지만 캐치가 있습니다. 첫 번째 차원 배열은 참조로 복사되었습니다. 즉, arr[0][0] = 'foo'실제로 하나가 아니라 두 개의 행이 변경됩니다.

var arr = Array(2).fill(Array(4));
arr[0][0] = 'foo';
console.info(arr);
console.info(arr[0][0], arr[1][0]);


나는 이것을 제안한다 :Array.from({length:5}, () => [])
vsync

여기서 주관적이지만이 답변 (첫 번째와 두 번째)은 간결하고 빠르며 현대적인 최상의 균형처럼 보입니다.
Brady Dowling

@zurfyx 어떤 아이디어가 있습니까, 아니면 누구나 웹 스톰이 이것에 대해 불평하는 이유는 무엇입니까? array.from은 값을 정의되지 않은 상태로 유지 한 것으로 보입니다. 스 니펫이 여기에서
제대로

46

일부 사람들이 불가능하다고 말하는 이유는 2 차원 배열이 실제로는 배열의 배열이기 때문입니다. 여기에있는 다른 의견은 JavaScript에서 2 차원 배열을 만드는 완벽하게 유효한 방법을 제공하지만 가장 순수한 관점은 1 차원 객체 배열을 갖는 것입니다. 각 해당 객체는 2 요소로 구성된 1 차원 배열입니다.

이것이 충돌하는 견해의 원인입니다.


41
아뇨. 일부 언어에서는와 같은 다차원 배열을 가질 수 있습니다 string[3,5] = "foo";. Y 축은 실제로 X 축의 자식이 아니기 때문에 일부 시나리오에서는 더 나은 방법입니다.
라파엘 Soares

3
기본 머신 코드에 도달하면 1보다 큰 차원의 모든 텐서가 우리가 이야기하는 언어 중 배열의 배열입니다. 캐시 최적화를 위해이를 염두에 두는 것이 좋습니다. 수치 컴퓨팅을 진지하게 수용하는 괜찮은 언어를 사용하면 다차원 구조를 메모리에 정렬하여 가장 많이 사용되는 차원을 연속적으로 저장할 수 있습니다. Python 's Numpy, Fortran 및 C가 떠 오릅니다. 실제로 이러한 이유로 치수를 여러 구조로 줄이는 것이 가치가있는 경우가 있습니다.
Thomas Browne

컴퓨터에는 치수에 대한 개념이 없습니다. 메모리 주소는 1 차원 만 있습니다. 그 밖의 모든 것은 프로그래머의 이익을위한 표기법입니다.
TeasingDart

3
@ThomasBrowne 정확하지 않습니다. "배열의 배열"은 내부 배열의 크기에 따라 약간의 저장 공간이 필요하며 (내가 다를 수 있음) 내부 배열이 저장된 위치를 찾기 위해 다른 포인터 역 참조가 필요합니다. "정확한"언어의 다차원 배열은 데이터 배열 자체가 다르기 때문에 들쭉날쭉 한 배열과 다릅니다. (그리고 혼란스러운 부분은 C 배열이 [a] [b] 구문으로 색인화되어 있어도 다차원 적이라는 것입니다.)
polkovnikov.ph

33

push를 사용하는 사람은 거의 없습니다.
새로운 것을 가져 오기 위해 0 또는 빈 문자열 ""과 같은 값으로 행렬을 초기화하는 방법을 보여 드리겠습니다.
10 원소 배열을 가지고 있다면 자바 스크립트에서 마지막 색인은 9가 될 것입니다!

function matrix( rows, cols, defaultValue){

  var arr = [];

  // Creates all lines:
  for(var i=0; i < rows; i++){

      // Creates an empty line
      arr.push([]);

      // Adds cols to the empty line:
      arr[i].push( new Array(cols));

      for(var j=0; j < cols; j++){
        // Initializes:
        arr[i][j] = defaultValue;
      }
  }

return arr;
}

사용 예 :

x = matrix( 2 , 3,''); // 2 lines, 3 cols filled with empty string
y = matrix( 10, 5, 0);// 10 lines, 5 cols filled with 0

나는 for프로 시저에서 마지막 (기본값을 설정하는)을 제거 하고 쓰기 m=matrix(3,4); m[1][2]=2; console.log(JSON.stringify(m));-우리는 매우 많은 행렬을 얻습니다 (너무 많이 중첩 됨)-마지막 for-defaultValue 단계에서 수리하지만 중첩 된 arras를 적게 사용하기 위해 프로 시저를 다시 작성할 수 있다고 생각합니다 기본값 설정.
Kamil Kiełczewski

27

2 라이너 :

var a = []; 
while(a.push([]) < 10);

배열로 채워진 길이 10의 배열 a를 생성합니다. (푸시는 배열에 요소를 추가하고 새로운 길이를 반환합니다)


13
원 라이너 : for (var a=[]; a.push([])<10;);?
Bergi

@Bergi 변수는 다음 줄에서 계속 정의됩니까?
StinkyCat

1
@StinkyCat : 그렇습니다 var. 항상 기능 범위입니다.
Bergi

따라서이 경우에는 귀하의 원 라이너가 쓸모가 없습니다 : "회원들에게 접근 할 수 없습니다"(질문 확인)
StinkyCat

1
domenukk와 @Bergi 둘 다 맞습니다. 나는 그것을 시험해 보았고 이후에 액세스 할 수 있습니다. 죄송합니다! 그리고 고마워요, 이것이 나에게 교훈이 될 수 있습니다;)
StinkyCat

24

가장 정답은

var nrows = ~~(Math.random() * 10);
var ncols = ~~(Math.random() * 10);
console.log(`rows:${nrows}`);
console.log(`cols:${ncols}`);
var matrix = new Array(nrows).fill(0).map(row => new Array(ncols).fill(0));
console.log(matrix);


fill은 얕은 복사 생성자를 사용하기 때문에 행을 직접 채울 수는 없습니다 . 따라서 모든 행은 동일한 메모리를 공유합니다 ... 여기서 각 행을 공유하는 방법을 보여주는 예가 있습니다 (다른 답변에서 가져옴).

// DON'T do this: each row in arr, is shared
var arr = Array(2).fill(Array(4));
arr[0][0] = 'foo'; // also modifies arr[1][0]
console.info(arr);

이것은 맨 위에 있어야합니다. 나는 비슷한 것을 사용 Array.apply(null, Array(nrows))했지만 훨씬 더 우아합니다.
dimiguel

이것에 대한 마지막 의견은 Internet Explorer와 Opera에서 지원하지 않습니다 fill. 대부분의 브라우저에서는 작동하지 않습니다.
dimiguel

@dimgl 채우기는이 경우 상수 맵을 사용하여 에뮬레이션 할 수 있습니다. Array(nrows).map(() => 0)또는Array(nrows).map(function(){ return 0; });
Conor O'Brien

20

가장 쉬운 방법 :

var arr  = [];

var arr1 = ['00','01'];
var arr2 = ['10','11'];
var arr3 = ['20','21'];

arr.push(arr1);
arr.push(arr2);
arr.push(arr3);

alert(arr[0][1]); // '01'
alert(arr[1][1]); // '11'
alert(arr[2][0]); // '20'

18

이것이 내가 달성 한 것입니다 :

var appVar = [[]];
appVar[0][4] = "bineesh";
appVar[0][5] = "kumar";
console.log(appVar[0][4] + appVar[0][5]);
console.log(appVar);

이것은 나에게 Bineeshkumar를 철자


2
부모 배열의 0 인덱스에만 액세스하는 방법에 주목하십시오. 예를 들어, appVar [5] [9] = 10; ... 이것으로 '정의되지 않은 속성 "9"를 설정할 수 없습니다.
RaisinBranCrunch

그러나 appVar[1][4] = "bineesh";잘못되었습니다. 어떻게 해결할 수 있습니까?
Gank

16

2 차원 배열은 1 차원 배열과 같은 방식으로 생성됩니다. 그리고 당신은 그들처럼 액세스합니다 array[0][1].

var arr = [1, 2, [3, 4], 5];

alert (arr[2][1]); //alerts "4"

14

아무도 대답하지 않았는지 확실하지 않지만 이것이 나를 위해 잘 작동한다는 것을 알았습니다.

var array = [[,],[,]]

예 :

var a = [[1,2],[3,4]]

예를 들어 2 차원 배열의 경우.


이 작업을 어떻게 동적으로 수행 할 수 있습니까? 크기가 다른 내부 배열을 원합니다.
alap

3
추가 쉼표 var array = [[],[]]가 필요하지 않습니다 .
Kaya Toast

13

자바 스크립트에서 2D 배열을 만들려면 먼저 배열을 만든 다음 배열을 요소로 추가하면됩니다. 이 메소드는 주어진 수의 행과 열을 가진 2D 배열을 반환합니다.

function Create2DArray(rows,columns) {
   var x = new Array(rows);
   for (var i = 0; i < rows; i++) {
       x[i] = new Array(columns);
   }
   return x;
}

배열을 만들려면 아래 방법을 사용하십시오.

var array = Create2DArray(10,20);

2
작동 방식 및 문제 해결 이유를 보여주는 설명 정보를 답변에 추가하십시오. 이것은 미래에이 페이지를 찾는 다른 사람들을 도울 것입니다
바나나에서 우리의 남자

Javascript에서 특정 수의 열로 사전 초기화 된 배열은 언제 필요합니까? [] 배열의 n 번째 요소에도 액세스 할 수 있습니다.
domenukk

함수가 대문자 C로 시작하는 것을 보았습니다. 특정 규칙에 따라 함수 생성자가 될 것이라고 제안하고 새 키워드와 함께 사용할 것입니다. 아주 사소하고 다소 의견이 많았지 만 여전히 대문자로 된 단어를 제안합니다.
Hachi

12

주소를 지정할 수 있고 모든 값을 null로 설정하여 스파 스가 아닌 "2D"배열 (x, y)을 만들려면 :

let 2Darray = new Array(x).fill(null).map(item =>(new Array(y).fill(null))) 

보너스 "3D"배열 (x, y, z)

let 3Darray = new Array(x).fill(null).map(item=>(new Array(y).fill(null)).map(item=>Array(z).fill(null)))

이에 대한 변형과 ​​수정은이 질문에 대한 의견과 다양한 지점에서 언급되었지만 실제 답변이 아니므로 여기에 추가하고 있습니다.

(대부분의 다른 답변과 유사) 이것은 O (x * y) 시간 복잡성을 가지므로 매우 큰 배열에는 적합하지 않을 수 있습니다.


1
fill동일한 값을 설정 하므로주의 하십시오. null`object로 변경 하면 모든 열에서 동일한 오브젝트가됩니다
Stanislav Mayorov

@StanislavMayorov 각 셀의 값을 설정하려면 다음과 같은 트릭을 사용하십시오.let 2Darray = new Array(x).fill(null).map(item =>(new Array(y).fill(null).map(cell =>(yourValueHere))))
haykam

10

배열 이해 사용

JavaScript 1.7 이상에서는 배열 이해 를 사용하여 2 차원 배열을 만들 수 있습니다 . 배열을 채우는 동안 항목을 필터링 및 / 또는 조작 할 수 있으며 루프를 사용할 필요가 없습니다.

var rows = [1, 2, 3];
var cols = ["a", "b", "c", "d"];

var grid = [ for (r of rows) [ for (c of cols) r+c ] ];

/* 
         grid = [
            ["1a","1b","1c","1d"],
            ["2a","2b","2c","2d"],
            ["3a","3b","3c","3d"]
         ]
*/

n x m원하는 배열을 만들고 호출하여 기본값으로 채울 수 있습니다

var default = 0;  // your 2d array will be filled with this value
var n_dim = 2;
var m_dim = 7; 

var arr = [ for (n of Array(n_dim)) [ for (m of Array(m_dim) default ]] 
/* 
         arr = [
            [0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0, 0],
         ]
*/

더 많은 예제와 문서는 여기 에서 찾을 수 있습니다 .

이 기능은 아직 표준 기능이 아닙니다 .


빠른 구글 확인 여기 ... yup ... for성명은 여전히 ​​루프입니다 ...
Pimp Trizkit

1
그것은 모든 브라우저에서 지원되지 않습니다 - 여기 ?
Kamil Kiełczewski

10

한 라이너 애호가를 위해 Array.from ()

// creates 8x8 array filed with "0"    
const arr2d = Array.from({ length: 8 }, () => Array.from({ length: 8 }, () => "0"))

또 하나는 (dmitry_romanov의 의견에서) Array (). fill ()을 사용합니다.

// creates 8x8 array filed with "0"    
const arr2d = Array(8).fill(0).map(() => Array(8).fill("0"))

ES6 + 스프레드 연산자 사용 (InspiredJW answer : "inspired" )

// same as above just a little shorter
const arr2d = [...Array(8)].map(() => Array(8).fill("0"))

2
우리는 0첫 번째 fill()기능 에서 제거 할 수 있습니다 :const arr2d = Array(8).fill().map(() => Array(8).fill("0"));
Jinsong Li

8

내 접근 방식은 @Bineesh 답변과 매우 유사하지만 더 일반적인 접근 방식입니다.

다음과 같이 이중 배열을 선언 할 수 있습니다.

var myDoubleArray = [[]];

그리고 다음과 같은 방식으로 컨텐츠를 저장하고 액세스합니다.

var testArray1 = [9,8]
var testArray2 = [3,5,7,9,10]
var testArray3 = {"test":123}
var index = 0;

myDoubleArray[index++] = testArray1;
myDoubleArray[index++] = testArray2;
myDoubleArray[index++] = testArray3;

console.log(myDoubleArray[0],myDoubleArray[1][3], myDoubleArray[2]['test'],) 

예상 출력을 인쇄합니다

[ 9, 8 ] 9 123

7

아래에서 가장 간단한 방법을 찾았습니다.

var array1 = [[]];   
array1[0][100] = 5; 

alert(array1[0][100]);
alert(array1.length);
alert(array1[0].length);

array1[1][100] = 666;던지기Uncaught TypeError: Cannot set property '100' of undefined
Kamil Kiełczewski

@ KamilKiełczewski 당신이 옳습니다. 이것은 첫 번째 배열 배열에 대해서만 시작하는 것처럼 보입니다. 두 번째 배열에 대해서는 array1[1][100] = 666;수행해야합니다 array1[1] = [];.
GMsoF

7

공연

오늘 2020.02.05 Chrome v79.0, Safari v13.0.4 및 Firefox v72.0의 MacOs HighSierra 10.13.6에서 선택한 솔루션에 대한 테스트를 수행합니다.

초기화되지 않은 2D 어레이에 대한 결론

  • 난해한 솔루션 {}/arr[[i,j]](N)은 크고 작은 배열에 가장 빠르며 큰 희소 배열에 적합한 것으로 보입니다.
  • for-[]/while(A, G) 기반 솔루션 은 빠르며 소형 어레이에 적합합니다.
  • 솔루션 for-[](B, C)은 빠르며 대형 어레이에 적합합니다.
  • 기반 솔루션 Array..map/from/fill(I, J, K, L, M) 은 소형 어레이의 경우 속도가 느리고 대형 어레이의 경우 속도가 빠릅니다.
  • 놀랍게도 for-Array(n)(B, C)는 사파리보다 훨씬 느립니다.for-[] (A)
  • 놀랍게도 for-[] (A) 큰 배열의 경우 모든 브라우저에서 느려집니다.
  • 솔루션 K는 모든 브라우저에서 작은 배열에 대해 느립니다.
  • 솔루션 A, E, G는 모든 브라우저에서 큰 배열에 대해 느립니다.
  • 솔루션 M은 모든 브라우저에서 모든 어레이에 대해 가장 느립니다.

여기에 이미지 설명을 입력하십시오

초기화 된 2D 어레이에 대한 결론

  • for/while(A, B, C, D, E, G) 기반 솔루션 은 모든 브라우저에서 작은 어레이에 가장 빠르거나 빠릅니다.
  • for(A, B, C, E) 기반 솔루션 은 모든 브라우저에서 큰 어레이에 가장 빠르거나 빠릅니다.
  • Array..map/from/fill(I, J, K, L, M) 기반 솔루션 은 모든 브라우저에서 작은 어레이에 대해 중간 빠르거나 느림
  • 큰 배열의 솔루션 F, G, H, I, J, K, L은 크롬 및 사파리에서는 중간 또는 빠르지 만 파이어 폭스에서는 가장 느립니다.
  • 난해한 솔루션 {}/arr[[i,j]](N)은 모든 브라우저에서 작고 큰 배열에서 가장 느립니다.

여기에 이미지 설명을 입력하십시오

세부

출력 배열을 채우지 않는 (초기화) 솔루션 테스트

솔루션 속도를 테스트합니다.

  • 작은 배열 (12 개 요소)-컴퓨터에서 테스트를 수행 할 수 있습니다 여기
  • 큰 배열 (1 개 백만 요소) 배열 - 당신은 당신의 시스템에서 테스트를 수행 할 수 HERE

출력 배열을 채우는 (초기화) 솔루션 테스트

솔루션 속도를 테스트합니다.

  • 소형 어레이 (12 개 요소)- 여기 에서 컴퓨터에서 테스트를 수행 할 수 있습니다.
  • 큰 배열 (1 개 백만 요소) 배열 - 당신은 당신의 시스템에서 테스트를 수행 할 수 HERE

여기에 이미지 설명을 입력하십시오


6

Javascript는 2 차원 배열을 지원하지 않습니다. 대신 배열을 다른 배열에 저장하고 액세스하려는 배열의 위치에 따라 해당 배열에서 데이터를 가져옵니다. 배열 수는 ZERO 에서 시작한다는 것을 기억하십시오 .

코드 예 :

/* Two dimensional array that's 5 x 5 

       C0 C1 C2 C3 C4 
    R0[1][1][1][1][1] 
    R1[1][1][1][1][1] 
    R2[1][1][1][1][1] 
    R3[1][1][1][1][1] 
    R4[1][1][1][1][1] 
*/

var row0 = [1,1,1,1,1],
    row1 = [1,1,1,1,1],
    row2 = [1,1,1,1,1],
    row3 = [1,1,1,1,1],
    row4 = [1,1,1,1,1];

var table = [row0,row1,row2,row3,row4];
console.log(table[0][0]); // Get the first item in the array

6

var playList = [
  ['I Did It My Way', 'Frank Sinatra'],
  ['Respect', 'Aretha Franklin'],
  ['Imagine', 'John Lennon'],
  ['Born to Run', 'Bruce Springsteen'],
  ['Louie Louie', 'The Kingsmen'],
  ['Maybellene', 'Chuck Berry']
];

function print(message) {
  document.write(message);
}

function printSongs( songs ) {
  var listHTML;
  listHTML = '<ol>';
  for ( var i = 0; i < songs.length; i += 1) {
    listHTML += '<li>' + songs[i][0] + ' by ' + songs[i][1] + '</li>';
  }
  listHTML += '</ol>';
  print(listHTML);
}

printSongs(playList);


6

ES6 +, ES2015 +는 훨씬 간단한 방법으로이 작업을 수행 할 수 있습니다


true로 채워진 3 x 2 배열 만들기

[...Array(3)].map(item => Array(2).fill(true))

고백해야합니다. 나는 당신의 대답을 "채택"을 추가 광산 , 한 - 라이너 모음.

5

필요에 따라 "레코드"를 추가하고 추가 처리를 위해 데이터베이스에 보내기 전에 필요한 모든 계산을 수행하고 업데이트 할 수 있도록 유연한 배열 함수를 만들어야했습니다. 다음 코드가 도움이되기를 바랍니다. :)

function Add2List(clmn1, clmn2, clmn3) {
    aColumns.push(clmn1,clmn2,clmn3); // Creates array with "record"
    aLine.splice(aPos, 0,aColumns);  // Inserts new "record" at position aPos in main array
    aColumns = [];    // Resets temporary array
    aPos++ // Increments position not to overlap previous "records"
}

버그를 최적화 및 / 또는 지적 해 주시기 바랍니다 :)


어때요 aLine.push([clmn1, clmn2, clmn3]);?
Pimp Trizkit

5

다음은 2 차원 배열을 만드는 빠른 방법입니다.

function createArray(x, y) {
    return Array.apply(null, Array(x)).map(e => Array(y));
}

이 기능을 ES5 기능으로 쉽게 전환 할 수 있습니다.

function createArray(x, y) {
    return Array.apply(null, Array(x)).map(function(e) {
        return Array(y);
    });
}

이것이 작동하는 이유 : new Array(n)생성자가 프로토 타입으로 객체를 생성 한 Array.prototype다음 객체를 할당하여 length배열이 채워지지 않습니다. 실제 멤버가 없기 때문에 Array.prototype.map함수를 실행할 수 없습니다 .

그러나 할 때와 같이 생성자에 둘 이상의 인수를 제공 Array(1, 2, 3, 4)하면 생성자가 arguments객체를 사용하여 인스턴스를 생성하고 채 웁니다.Array 올바르게 .

이 때문에 함수는 인수를 생성자에 분산시키기 Array.apply(null, Array(x))때문에를 사용할 수 있습니다 apply. 명확 Array.apply(null, Array(3))하게하기 위해하는 것은 doing 과 같습니다 Array(null, null, null).

실제 채워진 배열을 만들었으므로 이제 map두 번째 레이어 ( y)를 호출 하고 만들어야합니다 .


5

하나 아래에서 5x5 행렬을 만들어 채우십시오. null

var md = [];
for(var i=0; i<5; i++) {
    md.push(new Array(5).fill(null));
}

console.log(md);


3
이 답변은 잘못되었습니다. 슬롯에 같은 배열을 채우는 배열을 만듭니다. md[1][0] = 3 그리고 모든 요소 나머지도 업데이트
창족

5

런타임 에만 알려진 다음 배열 크기 는 동적 2D 배열 을 만드는 데 사용될 수 있습니다 .

var num = '123456';
var row = 3; // Known at run time
var col = 2; // Known at run time
var i = 0;

var array2D = [[]];
for(var r = 0; r < row; ++r)
{
    array2D[r] = [];
    for(var c = 0; c < col; ++c)
    {
        array2D[r][c] = num[i++];
    }
}
console.log(array2D); 
// [[ '1', '2' ], 
//  [ '3', '4' ], 
//  [ '5', '6' ]]

console.log(array2D[2][1]); // 6

4

2D 어레이의 크기를 미리 정의하지 않아도되는 또 다른 솔루션이 있으며 매우 간결합니다.

var table = {}
table[[1,2]] = 3 // Notice the double [[ and ]]
console.log(table[[1,2]]) // -> 3

때문에이 작품 [1,2]A와 사용되는 문자열로 변환되는 문자열 키 을위한 table객체입니다.


이 답변만으로도 JavaScript에서 "다차원"배열 인 정크를 망칠 필요가 없으며 매우 우아한 솔루션이 있습니다. 또한 다른 사람들이 실제로 다차원 배열을 전혀 만들지 않는다는 것을 보여줍니다. JavaScript의 "배열"; 이 답변은 임의의 크기와 내용의 의사 무한 크기, 무한 치수 배열을 완전히 "시뮬레이션"합니다. 다른 모든 재귀 및 루프 기반 응답은 작성할 수있는 배열 구조의 크기에 대한 상한이 훨씬 낮습니다. 더 큰 구조물의 경우 속도가 중요한 문제가 될 것입니다.
Pimp Trizkit

사전 충전을 시뮬레이션하려면 대신이 라인을 사용하십시오.var table = new Proxy({}, {get:(t,n)=>n in t ? t[n] : 42});
Pimp Trizkit

객체로 Array2D를 '에뮬레이트'하는 훌륭하고 창의적인 방법 :)
Kamil Kiełczewski

4

4x6 배열을 만들려면 간단히

const x = [...Array(6)].map(elem => new Array(4))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.