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.