etc./StackOverFlow

1...N을 포함하는 배열을 만드는 방법

청렴결백한 만능 재주꾼 2022. 2. 15. 08:50
반응형

질문자 :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]

Niko Ruotsalainen

다음과 같이 할 수 있습니다.

 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 이전 브라우저 에서는 작동하지 않습니다.


Igor Shubin

ES6을 사용하는 다양한 방법

스프레드 연산자( ... ) 및 키 방법 사용

 [ ...Array(N).keys() ].map( i => i+1);

채우기/매핑

 Array(N).fill().map((_, i) => i+1);

Array.from

 Array.from(Array(N), (_, i) => i+1)

Array.from 및 { 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)


Abdennour TOUMI

내가 원하는 것을 얻는다면 나중에 반복할 수 있는 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/


scunliffe

배열은 기본적으로 길이를 관리합니다. 순회할 때 인덱스를 메모리에 보유하고 해당 지점에서 참조할 수 있습니다. 임의의 인덱스를 알아야 하는 경우 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 */


ES6

확산

스프레드 연산자( ... ) 및 keys 방법을 사용하면 크기가 N인 임시 배열을 생성하여 인덱스를 생성한 다음 변수에 할당할 수 있는 새 배열을 생성할 수 있습니다.

 var foo = [ ...Array(N).keys() ];

채우기/매핑

먼저 필요한 배열의 크기를 만들고 undefined로 채운 다음 각 요소를 인덱스로 설정 map

 var foo = Array(N).fill().map((v,i)=>i);

Array.from

이것은 N 크기의 길이로 초기화하고 한 번에 배열을 채워야 합니다.

 Array.from({ length: N }, (v, i) => i)



주석과 혼란 대신에 위의 예에서 1..N의 값을 실제로 캡처하고 싶다면 몇 가지 옵션이 있습니다.

  1. 인덱스를 사용할 수 있는 경우 간단히 1씩 증가시킬 수 있습니다(예: ++i ).
  2. 인덱스가 사용되지 않는 경우 -- 그리고 아마도 더 효율적인 방법 -- 배열을 생성하되 N 을 N+1 을 나타내도록 한 다음 앞쪽으로 이동하는 것입니다.

    따라서 100개의 숫자를 원하는 경우:

     let arr; (arr=[ ...Array(101).keys() ]).shift()





vol7ron

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) );


Nate

매우 인기 있는 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); // => []

Evan

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; }

Ian Henry

Array 을 채우는 가장 빠른 방법은 다음과 같습니다.

 [...Array(5)].map((_,i) => i);

결과는 다음과 같습니다. [0, 1, 2, 3, 4]


аlex dykyі

이 질문에는 복잡한 답변이 많이 있지만 간단합니다.

 [...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);

bluejayke

ES2015/ES6 스프레드 연산자 사용

 [...Array(10)].map((_, i) => i + 1) 

 console.log([...Array(10)].map((_, i) => i + 1))


Vlad Bezden

다음을 사용할 수 있습니다.

 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]

nktssh

저처럼 앱에서 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]

자세한 내용은 이 튜토리얼 을 확인하세요.


Tyler Rick

이것은 아마도 숫자 배열을 생성하는 가장 빠른 방법일 것입니다

최단

 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]

왜요?

  1. while 은 가장 빠른 루프입니다.

  2. push 보다 다이렉트 세팅이 빠름

  3. [] new Array(10) 보다 빠릅니다.

  4. 짧습니다... 첫 번째 코드를 보세요. 그런 다음 여기의 다른 모든 기능을 살펴보십시오.

당신이 좋아하는 경우에 대한없이 살 수 없다

 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]

cocco

Array 을 채우는 새로운 방법은 다음과 같습니다.

 const array = [...Array(5).keys()] console.log(array)

결과는 다음과 같습니다. [0, 1, 2, 3, 4]


аlex dykyі

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); // ➜ []

Hongbo Miao

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)

user9274045

성능

오늘 2020.12.11 선택한 솔루션에 대해 Chrome v87, Safari v13.1.2 및 Firefox v83의 MacOs HighSierra 10.13.6에서 테스트를 수행합니다.

결과

모든 브라우저용

  • 솔루션 O ( while 기반)가 가장 빠릅니다(큰 N의 경우 Firefox 제외 - 하지만 빠릅니다)
  • 솔루션 T는 큰 N의 경우 Firefox에서 가장 빠릅니다.
  • 솔루션 M, P는 작은 N에 대해 빠릅니다.
  • 솔루션 V(lodash)는 큰 N에 대해 빠릅니다.
  • 솔루션 W,X는 작은 N에 대해 느림
  • 솔루션 F는 느립니다

여기에 이미지 설명 입력

세부

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!

다음은 크롬에 대한 예시 결과입니다.

여기에 이미지 설명 입력


Kamil Kiełczewski

최종 요약 보고서 .. 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()]

sapy

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);

nkitku

매우 간단하고 정확하게 1 - N을 생성하기 쉽습니다.

 const [, ...result] = Array(11).keys(); console.log('Result:', result);


Diamond

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")


gafi

ES6 표준의 새로운 Array 메소드 및 => 함수 구문 사용(작성 당시 Firefox만 해당).

undefined 구멍을 채우는 방법:

 Array(N).fill().map((_, i) => i + 1);

Array.from 은 "구멍"을 undefined Array.map 이 예상대로 작동합니다.

 Array.from(Array(5)).map((_, i) => i + 1)

szymzet

ES6에서:

 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)

ES5:

 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"))

bluejayke

빠른

이 솔루션은 아마도 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개 이상의 다른 솔루션으로 속도 테스트를 수행했습니다.


Kamil Kiełczewski

 Array(...Array(9)).map((_, i) => i); console.log(Array(...Array(9)).map((_, i) => i))


аlex dykyі

for(var i,a=[i=0];i<10;a[i++]=i);

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]


SammieFox

현재 이 완전한 답변 목록에 없는 유일한 풍미는 생성기를 특징으로 하는 것 같습니다. 이를 해결하기 위해:

 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})()]

Robin

Array(8).fill(0).map(Number.call, Number)

Igors Number.call 트릭을 fill() 을 사용하여 약간 줄입니다. ES6 이상에서만 작동합니다.


Tom

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]

나는 그것이 직관적이고 더 쉽기 때문에 이것을 선호한다.


Oluwagbemi Kadri

출처 : http:www.stackoverflow.com/questions/3746725/how-to-create-an-array-containing-1-n

반응형