[javascript] JavaScript에는 제공된 범위 내에서 범위를 생성하는 “range ()”와 같은 메서드가 있습니까?

PHP에서 할 수있는 일은 …

range(1, 3); // Array(1, 2, 3)
range("A", "C"); // Array("A", "B", "C")

즉, 상한과 하한을 전달하여 다양한 숫자 또는 문자를 얻을 수있는 기능이 있습니다.

이를 위해 기본적으로 JavaScript가 내장되어 있습니까? 그렇지 않은 경우 어떻게 구현합니까?



답변

번호

[...Array(5).keys()];
 => [0, 1, 2, 3, 4]

문자 반복

String.fromCharCode(...[...Array('D'.charCodeAt(0) - 'A'.charCodeAt(0) + 1).keys()].map(i => i + 'A'.charCodeAt(0)));
 => "ABCD"

되풀이

for (const x of Array(5).keys()) {
  console.log(x, String.fromCharCode('A'.charCodeAt(0) + x));
}
 => 0,"A" 1,"B" 2,"C" 3,"D" 4,"E"

기능으로

function range(size, startAt = 0) {
    return [...Array(size).keys()].map(i => i + startAt);
}

function characterRange(startChar, endChar) {
    return String.fromCharCode(...range(endChar.charCodeAt(0) -
            startChar.charCodeAt(0), startChar.charCodeAt(0)))
}

형식화 된 함수로

function range(size:number, startAt:number = 0):ReadonlyArray<number> {
    return [...Array(size).keys()].map(i => i + startAt);
}

function characterRange(startChar:string, endChar:string):ReadonlyArray<string> {
    return String.fromCharCode(...range(endChar.charCodeAt(0) -
            startChar.charCodeAt(0), startChar.charCodeAt(0)))
}

lodash.js _.range()함수

_.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]
String.fromCharCode(..._.range('A'.charCodeAt(0), 'D'.charCodeAt(0) + 1));
 => "ABCD"

라이브러리가없는 오래된 비 es6 브라우저 :

Array.apply(null, Array(5)).map(function (_, i) {return i;});
 => [0, 1, 2, 3, 4]

console.log([...Array(5).keys()]);

(nils petersohn 및 기타 해설자에 대한 ES6 학점)


답변

숫자의 경우 ES6을 사용할 수 있습니다 Array.from() , 요즘 모든 작동 IE를 제외한를 :

더 짧은 버전 :

Array.from({length: 20}, (x,i) => i);

더 긴 버전 :

Array.from(new Array(20), (x,i) => i)

0에서 19까지의 배열을 만듭니다. 이것은 다음 형식 중 하나로 더 단축 될 수 있습니다.

Array.from(Array(20).keys())
// or
[...Array(20).keys()]

예를 들어 하한과 상한도 지정할 수 있습니다.

Array.from(new Array(20), (x,i) => i + *lowerBound*)

이를 자세히 설명하는 기사 : http://www.2ality.com/2014/05/es6-array-methods.html


답변

내가 가장 좋아하는 양식 ( ES2015 )

Array(10).fill(1).map((x, y) => x + y)

그리고 step매개 변수 가있는 함수가 필요한 경우 :

const range = (start, stop, step = 1) =>
  Array(Math.ceil((stop - start) / step)).fill(start).map((x, y) => x + y * step)


답변

여기 내 2 센트가 있습니다 :

function range(start, count) {
  return Array.apply(0, Array(count))
    .map((element, index) => index + start);
}


답변

선택적 단계로 앞뒤로 문자와 숫자에 적용됩니다.

var range = function(start, end, step) {
    var range = [];
    var typeofStart = typeof start;
    var typeofEnd = typeof end;

    if (step === 0) {
        throw TypeError("Step cannot be zero.");
    }

    if (typeofStart == "undefined" || typeofEnd == "undefined") {
        throw TypeError("Must pass start and end arguments.");
    } else if (typeofStart != typeofEnd) {
        throw TypeError("Start and end arguments must be of same type.");
    }

    typeof step == "undefined" && (step = 1);

    if (end < start) {
        step = -step;
    }

    if (typeofStart == "number") {

        while (step > 0 ? end >= start : end <= start) {
            range.push(start);
            start += step;
        }

    } else if (typeofStart == "string") {

        if (start.length != 1 || end.length != 1) {
            throw TypeError("Only strings with one character are supported.");
        }

        start = start.charCodeAt(0);
        end = end.charCodeAt(0);

        while (step > 0 ? end >= start : end <= start) {
            range.push(String.fromCharCode(start));
            start += step;
        }

    } else {
        throw TypeError("Only string and number types are supported");
    }

    return range;

}

jsFiddle .

기본 유형을 보강하는 것이 필요한 경우에 지정하십시오 Array.range.


답변

간단한 범위 기능 :

function range(start, stop, step) {
    var a = [start], b = start;
    while (b < stop) {
        a.push(b += step || 1);
    }
    return a;
}

BitInt 데이터 형식 을 통합 하기 위해 모든 변수가 동일한 지 확인하는 몇 가지 검사가 포함될 수 있습니다 typeof start.

function range(start, stop, step) {
    var a = [start], b = start;
    if (typeof start == 'bigint') {
        stop = BigInt(stop)
        step = step? BigInt(step): 1n;
    } else
        step = step || 1;
    while (b < stop) {
        a.push(b += step);
    }
    return a;
}

stop예를 들어에 의해 정의 된 것보다 높은 값을 제거하려면 range(0,5,2)포함 6해서는 안됩니다.

function range(start, stop, step) {
    var a = [start], b = start;
    while (b < stop) {
        a.push(b += step || 1);
    }
    return (b > stop) ? a.slice(0,-1) : a;
}


답변

Array.range= function(a, b, step){
    var A= [];
    if(typeof a== 'number'){
        A[0]= a;
        step= step || 1;
        while(a+step<= b){
            A[A.length]= a+= step;
        }
    }
    else{
        var s= 'abcdefghijklmnopqrstuvwxyz';
        if(a=== a.toUpperCase()){
            b=b.toUpperCase();
            s= s.toUpperCase();
        }
        s= s.substring(s.indexOf(a), s.indexOf(b)+ 1);
        A= s.split('');
    }
    return A;
}


    Array.range(0,10);
    // [0,1,2,3,4,5,6,7,8,9,10]

    Array.range(-100,100,20);
    // [-100,-80,-60,-40,-20,0,20,40,60,80,100]

    Array.range('A','F');
    // ['A','B','C','D','E','F')

    Array.range('m','r');
    // ['m','n','o','p','q','r']