Does JavaScript have a method like “range()” to generate a range within the supplied bounds?

后端 未结 30 2790
广开言路
广开言路 2020-11-22 00:51

In PHP, you can do...

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

That is, there is a function that l

相关标签:
30条回答
  • 2020-11-22 01:34

    You can use lodash or Undescore.js range:

    var range = require('lodash/range')
    range(10)
    // -> [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
    

    Alternatively, if you only need a consecutive range of integers you can do something like:

    Array.apply(undefined, { length: 10 }).map(Number.call, Number)
    // -> [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
    

    In ES6 range can be implemented with generators:

    function* range(start=0, end=null, step=1) {
      if (end == null) {
        end = start;
        start = 0;
      }
    
      for (let i=start; i < end; i+=step) {
        yield i;
      }
    }
    

    This implementation saves memory when iterating large sequences, because it doesn't have to materialize all values into an array:

    for (let i of range(1, oneZillion)) {
      console.log(i);
    }
    
    0 讨论(0)
  • 2020-11-22 01:35
    var range = (l,r) => new Array(r - l).fill().map((_,k) => k + l);
    
    0 讨论(0)
  • 2020-11-22 01:35

    A rather minimalistic implementation that heavily employs ES6 can be created as follows, drawing particular attention to the Array.from() static method:

    const getRange = (start, stop) => Array.from(
      new Array((stop - start) + 1),
      (_, i) => i + start
    );
    
    0 讨论(0)
  • 2020-11-22 01:36

    Using Harmony generators, supported by all browsers except IE11:

    var take = function (amount, generator) {
        var a = [];
    
        try {
            while (amount) {
                a.push(generator.next());
                amount -= 1;
            }
        } catch (e) {}
    
        return a;
    };
    
    var takeAll = function (gen) {
        var a = [],
            x;
    
        try {
            do {
                x = a.push(gen.next());
            } while (x);
        } catch (e) {}
    
        return a;
    };
    
    var range = (function (d) {
        var unlimited = (typeof d.to === "undefined");
    
        if (typeof d.from === "undefined") {
            d.from = 0;
        }
    
        if (typeof d.step === "undefined") {
            if (unlimited) {
                d.step = 1;
            }
        } else {
            if (typeof d.from !== "string") {
                if (d.from < d.to) {
                    d.step = 1;
                } else {
                    d.step = -1;
                }
            } else {
                if (d.from.charCodeAt(0) < d.to.charCodeAt(0)) {
                    d.step = 1;
                } else {
                    d.step = -1;
                }
            }
        }
    
        if (typeof d.from === "string") {
            for (let i = d.from.charCodeAt(0); (d.step > 0) ? (unlimited ? true : i <= d.to.charCodeAt(0)) : (i >= d.to.charCodeAt(0)); i += d.step) {
                yield String.fromCharCode(i);
            }
        } else {
            for (let i = d.from; (d.step > 0) ? (unlimited ? true : i <= d.to) : (i >= d.to); i += d.step) {
                yield i;
            }
        }
    });
    

    Examples

    take

    Example 1.

    take only takes as much as it can get

    take(10, range( {from: 100, step: 5, to: 120} ) )

    returns

    [100, 105, 110, 115, 120]

    Example 2.

    to not neccesary

    take(10, range( {from: 100, step: 5} ) )

    returns

    [100, 105, 110, 115, 120, 125, 130, 135, 140, 145]

    takeAll

    Example 3.

    from not neccesary

    takeAll( range( {to: 5} ) )

    returns

    [0, 1, 2, 3, 4, 5]

    Example 4.

    takeAll( range( {to: 500, step: 100} ) )

    returns

    [0, 100, 200, 300, 400, 500]

    Example 5.

    takeAll( range( {from: 'z', to: 'a'} ) )

    returns

    ["z", "y", "x", "w", "v", "u", "t", "s", "r", "q", "p", "o", "n", "m", "l", "k", "j", "i", "h", "g", "f", "e", "d", "c", "b", "a"]

    0 讨论(0)
  • 2020-11-22 01:38

    OK, in JavaScript we don't have a range() function like PHP, so we need to create the function which is quite easy thing, I write couple of one-line functions for you and separate them for Numbers and Alphabets as below:

    for Numbers:

    function numberRange (start, end) {
      return new Array(end - start).fill().map((d, i) => i + start);
    }
    

    and call it like:

    numberRange(5, 10); //[5, 6, 7, 8, 9]
    

    for Alphabets:

    function alphabetRange (start, end) {
      return new Array(end.charCodeAt(0) - start.charCodeAt(0)).fill().map((d, i) => String.fromCharCode(i + start.charCodeAt(0)));
    }
    

    and call it like:

    alphabetRange('c', 'h'); //["c", "d", "e", "f", "g"]
    
    0 讨论(0)
  • 2020-11-22 01:41

    Did some research on some various Range Functions. Checkout the jsperf comparison of the different ways to do these functions. Certainly not a perfect or exhaustive list, but should help :)

    The Winner is...

    function range(lowEnd,highEnd){
        var arr = [],
        c = highEnd - lowEnd + 1;
        while ( c-- ) {
            arr[c] = highEnd--
        }
        return arr;
    }
    range(0,31);
    

    Technically its not the fastest on firefox, but crazy speed difference (imho) on chrome makes up for it.

    Also interesting observation is how much faster chrome is with these array functions than firefox. Chrome is at least 4 or 5 times faster.

    0 讨论(0)
提交回复
热议问题