1에서 N까지를 포함하는 JavaScript 배열을 만들기 위해 아래에 대한 대안을 찾고 있습니다. 여기서 N은 런타임에만 알려져 있습니다.
var foo = []; for (var i = 1; i <= N; i++) { foo.push(i); }
나에게 루프 없이 이것을 하는 방법이 있어야 하는 것처럼 느껴진다.
질문자 :Godders
1에서 N까지를 포함하는 JavaScript 배열을 만들기 위해 아래에 대한 대안을 찾고 있습니다. 여기서 N은 런타임에만 알려져 있습니다.
var foo = []; for (var i = 1; i <= N; i++) { foo.push(i); }
나에게 루프 없이 이것을 하는 방법이 있어야 하는 것처럼 느껴진다.
ES6 에서 Array from() 및 keys() 메서드를 사용합니다.
Array.from(Array(10).keys()) //=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
스프레드 연산자를 사용하는 짧은 버전.
[...Array(10).keys()] //=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
length
속성이 있는 객체를 사용 하여 Array from() 에 map 함수를 전달하여 1부터 시작합니다.
Array.from({length: 10}, (_, i) => i + 1) //=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
다음과 같이 할 수 있습니다.
var N = 10; Array.apply(null, {length: N}).map(Number.call, Number)
결과: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
또는 임의의 값으로:
Array.apply(null, {length: N}).map(Function.call, Math.random)
결과 : [0.7082694901619107, 0.9572225909214467, 0.8586748542729765, 0.8653848143294454, 0.008339877473190427, 0.9911756622605026, 0.8133423360995948, 0.8377588465809822, 0.5577575915958732, 0.16363654541783035]
첫째,주의 Number.call(undefined, N)
에 해당 Number(N)
만 반환 N
. 우리는 나중에 그 사실을 사용할 것입니다.
Array.apply(null, [undefined, undefined, undefined])
Array(undefined, undefined, undefined)
와 동일하며, 이는 3개 요소 배열을 생성하고 각 요소에 undefined
그것을 N개의 요소로 어떻게 일반화할 수 있습니까? Array()
가 다음과 같이 작동하는 방식을 고려하십시오.
function Array() { if ( arguments.length == 1 && 'number' === typeof arguments[0] && arguments[0] >= 0 && arguments && arguments[0] < 1 << 32 ) { return [ … ]; // array of length arguments[0], generated by native code } var a = []; for (var i = 0; i < arguments.length; i++) { a.push(arguments[i]); } return a; }
ECMAScript 5 , Function.prototype.apply(thisArg, argsArray)
도 두 번째 매개변수로 오리 유형의 배열과 유사한 객체를 허용합니다. Array.apply(null, { length: N })
호출하면 실행됩니다.
function Array() { var a = []; for (var i = 0; i < /* arguments.length = */ N; i++) { a.push(/* arguments[i] = */ undefined); } return a; }
이제 각 요소가 undefined
설정된 N 요소 배열이 있습니다. .map(callback, thisArg)
을 호출하면 callback.call(thisArg, element, index, array)
의 결과로 설정됩니다. 따라서 [undefined, undefined, …, undefined].map(Number.call, Number)
는 각 요소를 (Number.call).call(Number, undefined, index, array)
에 Number.call(undefined, index, array)
, 앞서 관찰한 것처럼 index
평가됩니다. 그러면 요소가 인덱스와 동일한 배열이 완성됩니다.
Array(N)
대신 Array.apply(null, {length: N})
문제를 해결해야 하는 이유는 무엇입니까? 결국 두 표현식 모두 정의되지 않은 요소의 N 요소 배열이 됩니다. 차이점은 전자의 표현에서는 각 요소가 명시적 으로 undefined로 설정 되어 있는 반면 후자의 경우에는 각 요소가 설정되지 않았다는 것입니다. .map()
문서에 따르면 :
callback
은 값이 할당된 배열의 인덱스에 대해서만 호출됩니다. 삭제되었거나 값이 할당된 적이 없는 인덱스에 대해서는 호출되지 않습니다.
따라서 Array(N)
은 충분하지 않습니다. Array(N).map(Number.call, Number)
는 길이가 N 인 초기화되지 않은 배열을 생성합니다.
이 기술은 ECMAScript 5에 지정된 Function.prototype.apply()
동작에 의존하기 때문에 Chrome 14 및 Internet Explorer 9와 같은 ECMAScript 5 이전 브라우저 에서는 작동하지 않습니다.
...
) 및 키 방법 사용 [ ...Array(N).keys() ].map( i => i+1);
Array(N).fill().map((_, i) => i+1);
Array.from(Array(N), (_, i) => i+1)
{ length: N }
해킹 Array.from({ length: N }, (_, i) => i+1)
i+1
을 필요한 표현식(예: i*2
, -i
, 1+i*2
, i%2
등)으로 변경하여 원하는 값으로 초기화된 배열을 생성할 수 있습니다. 표현식이 어떤 함수 f
로 표현될 수 있다면 첫 번째 형식은 간단히
[ ...Array(N).keys() ].map(f)
Array.from({length: 5}, (v, k) => k+1); // [1,2,3,4,5]
배열은 각 위치에서 undefined
로 초기화되므로 v
undefined
let demo= (N) => { console.log( [ ...Array(N).keys() ].map(( i) => i+1), Array(N).fill().map((_, i) => i+1) , Array.from(Array(N), (_, i) => i+1), Array.from({ length: N }, (_, i) => i+1) ) } demo(5)
f
ie가 있는 보다 일반적인 예 [ ...Array(N).keys() ].map((i) => f(i))
또는 더 간단하게
[ ...Array(N).keys() ].map(f)
let demo= (N,f) => { console.log( [ ...Array(N).keys() ].map(f), Array(N).fill().map((_, i) => f(i)) , Array.from(Array(N), (_, i) => f(i)), Array.from({ length: N }, (_, i) => f(i)) ) } demo(5, i=>2*i+1)
내가 원하는 것을 얻는다면 나중에 반복할 수 있는 1..n
이것이 당신에게 필요한 전부라면, 당신은 대신 이것을 할 수 있습니까?
var foo = new Array(45); // create an empty array with length 45
그런 다음 사용하고 싶을 때 ... (예를 들어 최적화되지 않음)
for(var i = 0; i < foo.length; i++){ document.write('Item: ' + (i + 1) + ' of ' + foo.length + '<br/>'); }
예를 들어 배열에 아무것도 저장할 필요가 없다면 반복할 수 있는 올바른 길이의 컨테이너만 있으면 됩니다. 이 방법이 더 쉬울 수 있습니다.
여기에서 실제로 확인하십시오: http://jsfiddle.net/3kcvm/
배열은 기본적으로 길이를 관리합니다. 순회할 때 인덱스를 메모리에 보유하고 해당 지점에서 참조할 수 있습니다. 임의의 인덱스를 알아야 하는 경우 indexOf
메서드를 사용할 수 있습니다.
즉, 필요에 따라 특정 크기의 배열을 선언하고 싶을 수도 있습니다.
var foo = new Array(N); // where N is a positive integer /* this will create an array of size, N, primarily for memory allocation, but does not create any defined values foo.length // size of Array foo[ Math.floor(foo.length/2) ] = 'value' // places value in the middle of the array */
스프레드 연산자( ...
) 및 keys
방법을 사용하면 크기가 N인 임시 배열을 생성하여 인덱스를 생성한 다음 변수에 할당할 수 있는 새 배열을 생성할 수 있습니다.
var foo = [ ...Array(N).keys() ];
먼저 필요한 배열의 크기를 만들고 undefined로 채운 다음 각 요소를 인덱스로 설정 map
var foo = Array(N).fill().map((v,i)=>i);
이것은 N 크기의 길이로 초기화하고 한 번에 배열을 채워야 합니다.
Array.from({ length: N }, (v, i) => i)
주석과 혼란 대신에 위의 예에서 1..N의 값을 실제로 캡처하고 싶다면 몇 가지 옵션이 있습니다.
++i
).인덱스가 사용되지 않는 경우 -- 그리고 아마도 더 효율적인 방법 -- 배열을 생성하되 N 을 N+1 을 나타내도록 한 다음 앞쪽으로 이동하는 것입니다.
따라서 100개의 숫자를 원하는 경우:
let arr; (arr=[ ...Array(101).keys() ]).shift()
ES6에서는 다음을 수행할 수 있습니다.
Array(N).fill().map((e,i)=>i+1);
http://jsbin.com/molabiluwa/edit?js,콘솔
편집: 질문을 업데이트한 후 Array(45)
를 Array(N)
console.log( Array(45).fill(0).map((e,i)=>i+1) );
매우 인기 있는 Underscore _.range 방법을 사용하십시오.
// _.range([start], stop, [step]) _.range(10); // => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] _.range(1, 11); // => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] _.range(0, 30, 5); // => [0, 5, 10, 15, 20, 25] _.range(0, -10, -1); // => [0, -1, -2, -3, -4, -5, -6, -7, -8, -9] _.range(0); // => []
function range(start, end) { var foo = []; for (var i = start; i <= end; i++) { foo.push(i); } return foo; }
그런 다음 호출
var foo = range(1, 5);
Javascript에는 이 작업을 수행하는 내장된 방법이 없지만 두 번 이상 수행해야 하는 경우 생성할 수 있는 완벽하게 유효한 유틸리티 함수입니다.
편집: 제 생각에는 다음이 더 나은 범위 기능입니다. 어쩌면 내가 LINQ에 편향되어 있기 때문일 수도 있지만 더 많은 경우에 더 유용하다고 생각합니다. 귀하의 마일리지가 다를 수 있습니다.
function range(start, count) { if(arguments.length == 1) { count = start; start = 0; } var foo = []; for (var i = 0; i < count; i++) { foo.push(start + i); } return foo; }
Array
을 채우는 가장 빠른 방법은 다음과 같습니다.
[...Array(5)].map((_,i) => i);
결과는 다음과 같습니다. [0, 1, 2, 3, 4]
이 질문에는 복잡한 답변이 많이 있지만 간단합니다.
[...Array(255).keys()].map(x => x + 1)
또한 위의 내용은 쓰기에 짧고 깔끔하지만(최대 길이의 경우) 다음이 조금 더 빠르다고 생각합니다.
127, Int8,
255, Uint8,
32,767, Int16,
65,535, Uint16,
2,147,483,647, Int32,
4,294,967,295, Uint32.
(최대 정수 값을 기준으로 함 ), Typed Arrays 에 대한 자세한 내용은 다음과 같습니다.
(new Uint8Array(255)).map(($,i) => i + 1);
이 솔루션은 두 개의 배열을 생성하고 추가 변수 선언 "$"를 사용하기 때문에 그리 이상적이지는 않습니다(이 방법을 사용하여 이를 해결할 방법이 확실하지 않음). 다음 솔루션이 가장 빠른 가능한 방법이라고 생각합니다.
for(var i = 0, arr = new Uint8Array(255); i < arr.length; i++) arr[i] = i + 1;
이 명령문이 만들어진 후 언제든지 현재 범위에서 "arr" 변수를 간단하게 사용할 수 있습니다.
간단한 기능을 만들고 싶다면(일부 기본 검증 포함):
function range(min, max) { min = min && min.constructor == Number ? min : 0; !(max && max.constructor == Number && max > min) && // boolean statements can also be used with void return types, like a one-line if statement. ((max = min) & (min = 0)); //if there is a "max" argument specified, then first check if its a number and if its graeter than min: if so, stay the same; if not, then consider it as if there is no "max" in the first place, and "max" becomes "min" (and min becomes 0 by default) for(var i = 0, arr = new ( max < 128 ? Int8Array : max < 256 ? Uint8Array : max < 32768 ? Int16Array : max < 65536 ? Uint16Array : max < 2147483648 ? Int32Array : max < 4294967296 ? Uint32Array : Array )(max - min); i < arr.length; i++) arr[i] = i + min; return arr; } //and you can loop through it easily using array methods if you want range(1,11).forEach(x => console.log(x)); //or if you're used to pythons `for...in` you can do a similar thing with `for...of` if you want the individual values: for(i of range(2020,2025)) console.log(i); //or if you really want to use `for..in`, you can, but then you will only be accessing the keys: for(k in range(25,30)) console.log(k); console.log( range(1,128).constructor.name, range(200).constructor.name, range(400,900).constructor.name, range(33333).constructor.name, range(823, 100000).constructor.name, range(10,4) // when the "min" argument is greater than the "max", then it just considers it as if there is no "max", and the new max becomes "min", and "min" becomes 0, as if "max" was never even written );
따라서 위의 기능을 사용하면 위의 초고속 "단순한 단일 라이너"가 초고속으로 더 짧아집니다.
range(1,14000);
ES2015/ES6 스프레드 연산자 사용
[...Array(10)].map((_, i) => i + 1)
console.log([...Array(10)].map((_, i) => i + 1))
다음을 사용할 수 있습니다.
new Array(/*any number which you want*/) .join().split(',') .map(function(item, index){ return ++index;})
예를 들어
new Array(10) .join().split(',') .map(function(item, index){ return ++index;})
다음 배열을 생성합니다:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
저처럼 앱에서 d3.js 를 사용하게 된다면 D3는 이를 수행하는 도우미 기능을 제공합니다.
따라서 0에서 4까지의 배열을 얻으려면 다음과 같이 쉽습니다.
d3.range(5) [0, 1, 2, 3, 4]
요청한대로 1에서 5까지의 배열을 얻으려면 다음을 수행하십시오.
d3.range(1, 5+1) [1, 2, 3, 4, 5]
자세한 내용은 이 튜토리얼 을 확인하세요.
이것은 아마도 숫자 배열을 생성하는 가장 빠른 방법일 것입니다
최단
var a=[],b=N;while(b--)a[b]=b+1;
인라인
var arr=(function(a,b){while(a--)b[a]=a;return b})(10,[]); //arr=[0,1,2,3,4,5,6,7,8,9]
1부터 시작하고 싶다면
var arr=(function(a,b){while(a--)b[a]=a+1;return b})(10,[]); //arr=[1,2,3,4,5,6,7,8,9,10]
기능을 원하십니까?
function range(a,b,c){c=[];while(a--)c[a]=a+b;return c}; //length,start,placeholder var arr=range(10,5); //arr=[5,6,7,8,9,10,11,12,13,14]
왜요?
while
은 가장 빠른 루프입니다.
push
보다 다이렉트 세팅이 빠름
[]
new Array(10)
보다 빠릅니다.
짧습니다... 첫 번째 코드를 보세요. 그런 다음 여기의 다른 모든 기능을 살펴보십시오.
당신이 좋아하는 경우에 대한없이 살 수 없다
for(var a=[],b=7;b>0;a[--b]=b+1); //a=[1,2,3,4,5,6,7]
또는
for(var a=[],b=7;b--;a[b]=b+1); //a=[1,2,3,4,5,6,7]
Array
을 채우는 새로운 방법은 다음과 같습니다.
const array = [...Array(5).keys()] console.log(array)
결과는 다음과 같습니다. [0, 1, 2, 3, 4]
lodash를 사용하는 경우 _.range 를 사용할 수 있습니다.
_.range([start=0], end, [step=1])
시작부터 끝까지(포함하지 않음)까지 진행되는 숫자(양수 및/또는 음수) 배열을 만듭니다. 끝이나 단계 없이 음수 시작이 지정된 경우 -1 단계가 사용됩니다. end가 지정되지 않으면 start로 시작하도록 설정되고 0으로 설정됩니다.
예:
_.range(4); // ➜ [0, 1, 2, 3] _.range(-4); // ➜ [0, -1, -2, -3] _.range(1, 5); // ➜ [1, 2, 3, 4] _.range(0, 20, 5); // ➜ [0, 5, 10, 15] _.range(0, -4, -1); // ➜ [0, -1, -2, -3] _.range(1, 4, 0); // ➜ [1, 1, 1] _.range(0); // ➜ []
ES6을 사용하면 다음을 수행할 수 있습니다.
// `n` is the size you want to initialize your array // `null` is what the array will be filled with (can be any other value) Array(n).fill(null)
오늘 2020.12.11 선택한 솔루션에 대해 Chrome v87, Safari v13.1.2 및 Firefox v83의 MacOs HighSierra 10.13.6에서 테스트를 수행합니다.
모든 브라우저용
while
기반)가 가장 빠릅니다(큰 N의 경우 Firefox 제외 - 하지만 빠릅니다)2가지 테스트 케이스를 수행합니다.
아래 스니펫은 테스트된 모든 솔루션을 나타냅니다. A B C D E F G H I J K L M N O P Q R S T U V W X
function A(N) { return Array.from({length: N}, (_, i) => i + 1) } function B(N) { return Array(N).fill().map((_, i) => i+1); } function C(N) { return Array(N).join().split(',').map((_, i) => i+1 ); } function D(N) { return Array.from(Array(N), (_, i) => i+1) } function E(N) { return Array.from({ length: N }, (_, i) => i+1) } function F(N) { return Array.from({length:N}, Number.call, i => i + 1) } function G(N) { return (Array(N)+'').split(',').map((_,i)=> i+1) } function H(N) { return [ ...Array(N).keys() ].map( i => i+1); } function I(N) { return [...Array(N).keys()].map(x => x + 1); } function J(N) { return [...Array(N+1).keys()].slice(1) } function K(N) { return [...Array(N).keys()].map(x => ++x); } function L(N) { let arr; (arr=[ ...Array(N+1).keys() ]).shift(); return arr; } function M(N) { var arr = []; var i = 0; while (N--) arr.push(++i); return arr; } function N(N) { var a=[],b=N;while(b--)a[b]=b+1; return a; } function O(N) { var a=Array(N),b=0; while(b<N) a[b++]=b; return a; } function P(N) { var foo = []; for (var i = 1; i <= N; i++) foo.push(i); return foo; } function Q(N) { for(var a=[],b=N;b--;a[b]=b+1); return a; } function R(N) { for(var i,a=[i=0];i<N;a[i++]=i); return a; } function S(N) { let foo,x; for(foo=[x=N]; x; foo[x-1]=x--); return foo; } function T(N) { return new Uint8Array(N).map((item, i) => i + 1); } function U(N) { return '_'.repeat(5).split('').map((_, i) => i + 1); } function V(N) { return _.range(1, N+1); } function W(N) { return [...(function*(){let i=0;while(i<N)yield ++i})()] } function X(N) { function sequence(max, step = 1) { return { [Symbol.iterator]: function* () { for (let i = 1; i <= max; i += step) yield i } } } return [...sequence(N)]; } [A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X].forEach(f=> { console.log(`${f.name} ${f(5)}`); })
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.20/lodash.min.js" integrity="sha512-90vH1Z83AJY9DmlWa8WkjkV79yfS2n2Oxhsi2dZbIv0nC4E6m5AbH8Nh156kkM7JePmqD6tcZsfad1ueoaovww==" crossorigin="anonymous"> </script> This shippet only presents functions used in performance tests - it not perform tests itself!
다음은 크롬에 대한 예시 결과입니다.
최종 요약 보고서 .. Drrruummm Rolll -
이것은 ES6을 사용하지 않고 크기 N(여기서는 10)의 배열을 생성하는 가장 짧은 코드 입니다. 위의 Cocco 버전은 비슷하지만 가장 짧지는 않습니다.
(function(n){for(a=[];n--;a[n]=n+1);return a})(10)
그러나 이 Code golf(최소한의 소스 코드 바이트로 특정 문제를 해결하기 위한 경쟁) 의 확실한 승자 는 Niko Ruotsalainen 입니다. 배열 생성자 및 ES6 확산 연산자 사용 . (대부분의 ES6 구문은 유효한 typeScript이지만 다음은 그렇지 않습니다. 사용하는 동안 신중해야 합니다)
[...Array(10).keys()]
https://stackoverflow.com/a/49577331/8784402
[...Array(N)].map((v, i) => from + i * step);
예 및 기타 대안
Array.from(Array(10).keys()).map(i => 4 + i * 2); //=> [4, 6, 8, 10, 12, 14, 16, 18, 20, 22] [...Array(10).keys()].map(i => 4 + i * -2); //=> [4, 2, 0, -2, -4, -6, -8, -10, -12, -14] Array(10).fill(0).map((v, i) => 4 + i * 2); //=> [4, 6, 8, 10, 12, 14, 16, 18, 20, 22] Array(10).fill().map((v, i) => 4 + i * -2); //=> [4, 2, 0, -2, -4, -6, -8, -10, -12, -14] [...Array(10)].map((v, i) => 4 + i * 2); //=> [4, 6, 8, 10, 12, 14, 16, 18, 20, 22]
범위 기능 const range = (from, to, step) => [...Array(Math.floor((to - from) / step) + 1)].map((_, i) => from + i * step); range(0, 9, 2); //=> [0, 2, 4, 6, 8] // can also assign range function as static method in Array class (but not recommended ) Array.range = (from, to, step) => [...Array(Math.floor((to - from) / step) + 1)].map((_, i) => from + i * step); Array.range(2, 10, 2); //=> [2, 4, 6, 8, 10] Array.range(0, 10, 1); //=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] Array.range(2, 10, -1); //=> [] Array.range(3, 0, -1); //=> [3, 2, 1, 0]
반복자로 class Range { constructor(total = 0, step = 1, from = 0) { this[Symbol.iterator] = function* () { for (let i = 0; i < total; yield from + i++ * step) {} }; } } [...new Range(5)]; // Five Elements //=> [0, 1, 2, 3, 4] [...new Range(5, 2)]; // Five Elements With Step 2 //=> [0, 2, 4, 6, 8] [...new Range(5, -2, 10)]; // Five Elements With Step -2 From 10 //=>[10, 8, 6, 4, 2] [...new Range(5, -2, -10)]; // Five Elements With Step -2 From -10 //=> [-10, -12, -14, -16, -18] // Also works with for..of loop for (i of new Range(5, -2, 10)) console.log(i); // 10 8 6 4 2
발전기 전용 const Range = function* (total = 0, step = 1, from = 0) { for (let i = 0; i < total; yield from + i++ * step) {} }; Array.from(Range(5, -2, -10)); //=> [-10, -12, -14, -16, -18] [...Range(5, -2, -10)]; // Five Elements With Step -2 From -10 //=> [-10, -12, -14, -16, -18] // Also works with for..of loop for (i of Range(5, -2, 10)) console.log(i); // 10 8 6 4 2 // Lazy loaded way const number0toInf = Range(Infinity); number0toInf.next().value; //=> 0 number0toInf.next().value; //=> 1 // ...
class Range2 { constructor(to = 0, step = 1, from = 0) { this[Symbol.iterator] = function* () { let i = 0, length = Math.floor((to - from) / step) + 1; while (i < length) yield from + i++ * step; }; } } [...new Range2(5)]; // First 5 Whole Numbers //=> [0, 1, 2, 3, 4, 5] [...new Range2(5, 2)]; // From 0 to 5 with step 2 //=> [0, 2, 4] [...new Range2(5, -2, 10)]; // From 10 to 5 with step -2 //=> [10, 8, 6]
제너레이터 사용 const Range2 = function* (to = 0, step = 1, from = 0) { let i = 0, length = Math.floor((to - from) / step) + 1; while (i < length) yield from + i++ * step; }; [...Range2(5, -2, 10)]; // From 10 to 5 with step -2 //=> [10, 8, 6] let even4to10 = Range2(10, 2, 4); even4to10.next().value; //=> 4 even4to10.next().value; //=> 6 even4to10.next().value; //=> 8 even4to10.next().value; //=> 10 even4to10.next().value; //=> undefined
class _Array<T> extends Array<T> { static range(from: number, to: number, step: number): number[] { return Array.from(Array(Math.floor((to - from) / step) + 1)).map( (v, k) => from + k * step ); } } _Array.range(0, 9, 1);
매우 간단하고 정확하게 1 - N을 생성하기 쉽습니다.
const [, ...result] = Array(11).keys(); console.log('Result:', result);
ES6에는 2개의 인수를 취하는 Array.from 을 사용하는 또 다른 방법이 있습니다. 첫 번째는 arrayLike(이 경우 length
속성이 있는 객체)이고 두 번째는 매핑 함수입니다(이 경우 항목을 해당 인덱스에 매핑합니다. )
Array.from({length:10}, (v,i) => i)
이것은 더 짧고 짝수 생성과 같은 다른 시퀀스에 사용할 수 있습니다.
Array.from({length:10}, (v,i) => i*2)
또한 이것은 배열을 한 번만 반복하기 때문에 대부분의 다른 방법보다 성능이 더 좋습니다. 몇 가지 비교를 위해 스니핏을 확인하십시오.
// open the dev console to see results count = 100000 console.time("from object") for (let i = 0; i<count; i++) { range = Array.from({length:10}, (v,i) => i ) } console.timeEnd("from object") console.time("from keys") for (let i =0; i<count; i++) { range = Array.from(Array(10).keys()) } console.timeEnd("from keys") console.time("apply") for (let i = 0; i<count; i++) { range = Array.apply(null, { length: 10 }).map(function(element, index) { return index; }) } console.timeEnd("apply")
ES6 표준의 새로운 Array 메소드 및 =>
함수 구문 사용(작성 당시 Firefox만 해당).
undefined
구멍을 채우는 방법:
Array(N).fill().map((_, i) => i + 1);
Array.from
은 "구멍"을 undefined
Array.map
이 예상대로 작동합니다.
Array.from(Array(5)).map((_, i) => i + 1)
Array.from({length: 1000}, (_, i) => i).slice(1);
또는 더 나은 방법(추가 변수 _ 및 추가 slice
호출 없이):
Array.from({length:1000}, Number.call, i => i + 1)
또는 약간 더 빠른 결과를 위해 목록이 256개 결과보다 짧은 경우 Uint8Array를 사용할 수 있습니다(또는 목록이 얼마나 짧은지에 따라 다른 Uint 목록을 사용할 수 있습니다(예: 최대 수 65535의 경우 Uint16, 최대 수의 경우 Uint32). 4294967295 등. 공식적으로 이러한 형식화된 배열은 ES6에만 추가되었지만 ). 예를 들어:
Uint8Array.from({length:10}, Number.call, i => i + 1)
Array.apply(0, {length: 1000}).map(function(){return arguments[1]+1});
또는 ES5에서 map 함수의 경우( Array.from
함수에 대한 두 번째 매개변수와 같이) Number.call을 사용할 수 있습니다.
Array.apply(0,{length:1000}).map(Number.call,Number).slice(1)
.slice
에 반대하는 경우 위와 같은 ES5(ES6에서)를 다음과 같이 수행할 수 있습니다.
Array.apply(0,{length:1000}).map(Number.call, Function("i","return i+1"))
이 솔루션은 아마도 lodash _.range 함수에서 영감을 받아 가장 빠를 것입니다(그러나 내 것이 더 간단하고 빠릅니다).
let N=10, i=0, a=Array(N); while(i<N) a[i++]=i; console.log(a);
while/for
기반으로 한 현재(2020.12.11) 기존 답변에 비해 성능 이점
a=Array(N)
의해 처음에 한 번 할당됩니다.i++
사용 - 어떤 외모 빠른 인덱스를 감소 30 % 이상에 관한 것입니다 i--
(아마 때문에 CPU의 캐시 메모리 빠른 정방향)이 답변 에서 20개 이상의 다른 솔루션으로 속도 테스트를 수행했습니다.
Array(...Array(9)).map((_, i) => i); console.log(Array(...Array(9)).map((_, i) => i))
for(var i,a=[i=0];i<10;a[i++]=i);
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
현재 이 완전한 답변 목록에 없는 유일한 풍미는 생성기를 특징으로 하는 것 같습니다. 이를 해결하기 위해:
const gen = N => [...(function*(){let i=0;while(i<N)yield i++})()]
다음과 같이 사용할 수 있습니다.
gen(4) // [0,1,2,3]
이것에 대한 좋은 점은 증가시킬 필요가 없다는 것입니다 ... @igor-shubin이 준 답변에서 영감을 얻으려면 무작위 배열을 매우 쉽게 만들 수 있습니다.
const gen = N => [...(function*(){let i=0; while(i++<N) yield Math.random() })()]
그리고 오히려 뭔가 이상과 같은 긴 조작 상 비용 :
const slow = N => new Array(N).join().split(',').map((e,i)=>i*5) // [0,5,10,15,...]
대신 다음을 수행할 수 있습니다.
const fast = N => [...(function*(){let i=0;while(i++<N)yield i*5})()]
Array(8).fill(0).map(Number.call, Number)
Igors Number.call
트릭을 fill()
을 사용하여 약간 줄입니다. ES6 이상에서만 작동합니다.
Es6에서 배열 채우기 및 매핑을 사용할 수 있습니다. 이 질문에 대한 답변에서 일부 사람들이 제안한 것처럼. 다음은 몇 가지 예입니다.
Example-One: Array(10).fill(0).map((e,i)=>i+1) Result-One: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] Example-Two: Array(100/10).fill(0).map((e,i)=>(i*10)+10) Result-Two:[10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
나는 그것이 직관적이고 더 쉽기 때문에 이것을 선호한다.
출처 : http:www.stackoverflow.com/questions/3746725/how-to-create-an-array-containing-1-n
특정 라인에 대한 eslint 규칙 끄기 (0) | 2022.02.17 |
---|---|
"이전 형제" 선택자가 있습니까? (0) | 2022.02.15 |
JavaScript는 참조에 의한 전달 또는 값에 의한 전달 언어입니까? (0) | 2022.02.15 |
'git reset'을 취소하는 방법은 무엇입니까? (0) | 2022.02.15 |
Bash 셸 스크립트에서 입력 인수의 존재 확인 (0) | 2022.02.15 |