JavaScript의 배열 ( w3schools 및 devguru 포함)에서 읽은 대부분의 자습서 는 var test = new Array(4);
구문을 사용하여 Array 생성자에 정수를 전달하여 특정 길이의 배열을 초기화 할 수 있다고 제안 합니다.
내 js 파일 에서이 구문을 자유롭게 사용한 후 jsLint를 통해 파일 중 하나를 실행 했으며 놀라웠 습니다.
오류 : 1 행 문자 22에 문제가 있습니다. ‘)’이 예상되었지만 ‘4’가 표시되었습니다.
var test = new Array (4);
1 행 문자 23 문제 : 예상되는 ‘;’ 대신 ‘)’를 보았습니다.
var test = new Array (4);
1 행 문자 23의 문제점 : 식별자를 예상하고 대신 ‘)’를 보았습니다.
jsLint의 동작에 대한 설명을 읽은 후에 는 jsLint가 실제로 new Array()
구문을 좋아하지 않는 것처럼 보이고 대신 선호합니다.[]
배열을 선언 할 때 합니다.
그래서 몇 가지 질문이 있습니다.
먼저 왜? 를 사용하여 위험을 감수하고 있습니까?new Array()
구문을 대신 있습니까? 알아야 할 브라우저 비 호환성이 있습니까?
둘째, 대괄호 구문으로 전환하면 배열을 선언하고 길이를 한 줄로 설정하는 방법이 있습니까? 아니면 다음과 같이해야합니다.
var test = [];
test.length = 4;
답변
-
왜 길이를 초기화하고 싶습니까? 이론적으로는 이것이 필요하지 않습니다.
length
배열 을 사용 하는지 여부를 확인하기 위해 를 사용하는 모든 테스트 에서 배열이 비어 있지 않은 것으로보고 하기 때문에 혼동 될 수 있습니다 .
일부 테스트에 따르면 나중에 배열이 채워지면 큰 배열의 초기 길이를 설정하는 것이 더 효율적일 수 있지만 성능 향상 (있는 경우)은 브라우저마다 다릅니다. -
new Array()
생성자가 모호하기 때문에 jsLint는 마음에 들지 않습니다 .new Array(4);
길이가 4 인 빈 배열 을 만듭니다.
new Array('4');
값을 포함 하는 배열 을 만듭니다
'4'
.
귀하의 의견과 관련하여 : JS에서는 배열의 길이를 초기화 할 필요가 없습니다. 동적으로 자랍니다. 예를 들어 길이를 일부 변수에 저장할 수 있습니다.
var data = [];
var length = 5; // user defined length
for(var i = 0; i < length; i++) {
data.push(createSomeObject());
}
답변
-
Array(5)
길이가 5이지만 값이없는 배열을 제공하므로 반복 할 수 없습니다. -
Array.apply(null, Array(5)).map(function () {})
길이가 5이고 값으로 정의되지 않은 배열을 제공하므로 반복 할 수 있습니다. -
Array.apply(null, Array(5)).map(function (x, i) { return i; })
길이가 5이고 값이 0,1,2,3,4 인 배열을 제공합니다. -
Array(5).forEach(alert)
아무것도하지 않습니다,Array.apply(null, Array(5)).forEach(alert)
당신에게 5 개의 경고를줍니다 -
ES6
Array.from
당신이 사용할 수 있도록 지금 우리에게 제공Array.from(Array(5)).forEach(alert)
-
당신이 특정 값으로 초기화하려면, 다음이 좋은 알고에 …
Array.from('abcde')
,Array.from('x'.repeat(5))
또는Array.from({length: 5}, (v, i) => i) // gives [0, 1, 2, 3, 4]
답변
ES2015.fill()
를 사용하면 다음과 같이 간단하게 수행 할 수 있습니다.
// `n` is the size you want to initialize your array
// `0` is what the array will be filled with (can be any other value)
Array(n).fill(0)
어느 것보다 훨씬 간결합니다 Array.apply(0, new Array(n)).map(i => value)
0
in 을 제거하고 .fill()
인수없이 실행할 수 있으며 배열을로 채 웁니다 undefined
. ( 그러나 이것은 Typescript에서 실패합니다 )
답변
[...Array(6)].map(x => 0);
// [0, 0, 0, 0, 0, 0]
또는
Array(6).fill(0);
// [0, 0, 0, 0, 0, 0]
참고 : 빈 슬롯을 반복 할 수 없습니다. Array(4).forEach(() => …)
또는
( typescript safe )
Array(6).fill(null).map((_, i) => i);
// [0, 1, 2, 3, 4, 5]
또는
함수를 사용하는 고전적인 방법 (모든 브라우저에서 작동)
function NewArray(size) {
var x = [];
for (var i = 0; i < size; ++i) {
x[i] = i;
return x;
}
}
var a = NewArray(10);
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
중첩 배열 만들기
직관적 으로 2D 배열을 fill
만들 때 새 인스턴스를 만들어야합니다. 그러나 실제로 일어날 것은 동일한 배열이 참조로 저장된다는 것입니다.
var a = Array(3).fill([6]);
// [ [6], [6], [6] ]
a[0].push(9);
// [ [6, 9], [6, 9], [6, 9] ]
해결책
var a = [...Array(3)].map(x => []);
a[0].push(4, 2);
// [ [4, 2], [], [] ]
따라서 3×2 배열은 다음과 같습니다.
[...Array(3)].map(x => Array(2).fill(0));
// [ [0, 0], [0, 0], [0, 0] ]
N 차원 배열
function NArray(...dimensions) {
var index = 0;
function NArrayRec(dims) {
var first = dims[0], next = dims.slice().splice(1);
if(dims.length > 1)
return Array(dims[0]).fill(null).map((x, i) => NArrayRec(next ));
return Array(dims[0]).fill(null).map((x, i) => (index++));
}
return NArrayRec(dimensions);
}
var arr = NArray(3, 2, 4);
// [ [ [ 0, 1, 2, 3 ] , [ 4, 5, 6, 7] ],
// [ [ 8, 9, 10, 11] , [ 12, 13, 14, 15] ],
// [ [ 16, 17, 18, 19] , [ 20, 21, 22, 23] ] ]
체스 판 초기화
var Chessboard = [...Array(8)].map((x, j) => {
return Array(8).fill(null).map((y, i) => {
return `${String.fromCharCode(65 + i)}${8 - j}`;
});
});
// [ [A8, B8, C8, D8, E8, F8, G8, H8],
// [A7, B7, C7, D7, E7, F7, G7, H7],
// [A6, B6, C6, D6, E6, F6, G6, H6],
// [A5, B5, C5, D5, E5, F5, G5, H5],
// [A4, B4, C4, D4, E4, F4, G4, H4],
// [A3, B3, C3, D3, E3, F3, G3, H3],
// [A2, B2, C2, D2, E2, F2, G2, H2],
// [A1, B1, C1, D1, E1, F1, G1, H1] ]
답변
가장 짧은 :
[...Array(1000)]
답변
ES6의 소개 Array.from
당신은을 만들 수 있습니다 Array
어떤에서 “같은 배열” 또는 반복 가능 객체는 객체 :
Array.from({length: 10}, (x, i) => i);
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
이 경우 “배열 형” 객체 {length: 10}
의 최소 정의, 즉 속성이 정의 된 빈 객체를 나타 냅니다.length
Array.from
결과 배열에 두 번째 인수를 매핑 할 수 있습니다.
답변
길이 속성을 4로 초기화합니다.
var x = [,,,,];