Frage JavaScript-Funktion ähnlich wie Python-Bereich ()


Gibt es in JavaScript eine ähnliche Funktion wie Python? range()?

Ich denke, es sollte einen besseren Weg geben, als jedes Mal die folgenden Zeilen zu schreiben:

array = new Array();
for (i = 0; i < specified_len; i++) {
    array[i] = i;
}

54
2017-11-25 18:33


Ursprung


Antworten:


NeinEs gibt keine, aber du kannst eins machen.

JavaScript-Implementierung von Python range()

Versuchen emulieren, wie es in Python funktioniert, Würde ich ähnliche Funktion wie folgt erstellen:

function range(start, stop, step) {
    if (typeof stop == 'undefined') {
        // one param defined
        stop = start;
        start = 0;
    }

    if (typeof step == 'undefined') {
        step = 1;
    }

    if ((step > 0 && start >= stop) || (step < 0 && start <= stop)) {
        return [];
    }

    var result = [];
    for (var i = start; step > 0 ? i < stop : i > stop; i += step) {
        result.push(i);
    }

    return result;
};

Sehen dieses Spiel für einen Beweis.

Vergleich zwischen range() in JavaScript und Python

Es funktioniert auf folgende Weise:

  • range(4) kehrt zurück [0, 1, 2, 3],
  • range(3,6) kehrt zurück [3, 4, 5],
  • range(0,10,2) kehrt zurück [0, 2, 4, 6, 8],
  • range(10,0,-1) kehrt zurück [10, 9, 8, 7, 6, 5, 4, 3, 2, 1],
  • range(8,2,-2) kehrt zurück [8, 6, 4],
  • range(8,2) kehrt zurück [],
  • range(8,2,2) kehrt zurück [],
  • range(1,5,-1) kehrt zurück [],
  • range(1,5,-2) kehrt zurück [],

und sein Pendant Python funktioniert genau so (zumindest in den genannten Fällen):

>>> range(4)
[0, 1, 2, 3]
>>> range(3,6)
[3, 4, 5]
>>> range(0,10,2)
[0, 2, 4, 6, 8]
>>> range(10,0,-1)
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
>>> range(8,2,-2)
[8, 6, 4]
>>> range(8,2)
[]
>>> range(8,2,2)
[]
>>> range(1,5,-1)
[]
>>> range(1,5,-2)
[]

Wenn Sie also eine Funktion benötigen, die ähnlich wie Python funktioniert range()Sie können die oben erwähnte Lösung verwenden.


59
2017-11-25 18:38



Für einen sehr einfachen Bereich in ES6:

let range = n => Array.from(Array(n).keys())

59
2018-06-23 00:59



2018: Diese Antwort bleibt immer upvotes, also hier ist ein Update. Der folgende Code ist veraltet, aber glücklicherweise ES6 standardisierte Generatoren und die yield Schlüsselwort, und sie werden universell über Plattformen hinweg unterstützt. Ein Beispiel für die faulen range() verwenden yield kann gefunden werden Hier.


Zusätzlich zu dem, was bereits gesagt wurde, bietet Javascript 1.7+ Unterstützung für Iteratoren und Generatoren das kann verwendet werden, um eine faule, speichereffiziente Version von zu erstellen range, ähnlich wie xrange in Python2:

function range(low, high) {  
    return {
        __iterator__: function() {
            return {  
                next: function() {
                    if (low > high)
                        throw StopIteration;  
                    return low++;
                }
            }
        }
    }
}

for (var i in range(3, 5))  
  console.log(i); // 3,4,5

23
2017-11-25 23:10



Ein Port von Pythons range Funktion wird von der zur Verfügung gestellt Unterstrich.js und lodash Dienstprogrammbibliotheken (zusammen mit vielen anderen nützlichen Tools). Beispiele, die aus der Unterstrich-Dokumentation kopiert wurden:

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

14
2017-08-30 16:09



Verschmelzung beider Antworten aus @Tadeck und @georgIch kam auf Folgendes:

function* range(start, stop, step = 1) {
    if (typeof stop === 'undefined') {
        // one param defined
        stop = start;
        start = 0;
    }

    for (let i = start; step > 0 ? i < stop : i > stop; i += step) {
        yield i;
    }
}

Um es in einer for-Schleife zu verwenden, benötigen Sie die ES6 / JS1.7 for-of-Schleife:

for (let i of range(0, 10, 2)) {
    console.log(i);
}
// Outputs => 0 2 4 6 8

13
2017-10-24 19:23



Bitte schön.

Dies wird den Wert jedes Index mit der Indexnummer schreiben (oder überschreiben).

Array.prototype.writeIndices = function( n ) {
    for( var i = 0; i < (n || this.length); ++i ) this[i] = i;
    return this;
};

Wenn Sie keine Nummer angeben, wird die aktuelle Länge des Arrays verwendet.

Benutze es so:

var array = [].writeIndices(10);  // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

7
2017-11-25 18:48



Dies kann erreicht werden, indem ein Iterator an die Number Prototyp

  Number.prototype[Symbol.iterator] = function* () { 
     for (var i = 0; i <= this; i++) {
       yield i
     } 
  }

[...5] // will result in [0,1,2,3,4,5]

Entnommen aus Kyle Simpsons Kurs Asynchrones JavaScript neu denken


7
2017-08-14 00:37



Um ein Array von Größe zu bekommen xHier ist ein One-Liner, ohne eine Bibliothek zu benutzen

var range = n => Array(n + 1).join(1).split('').map((x, i) => i)

arbeitet als

> range(4)
[0, 1, 2, 3]

3
2018-03-23 15:52



Sie dürfen verwenden unterstreichen Bibliothek. Es enthält Dutzende nützlicher Funktionen zum Arbeiten mit Arrays und vielem mehr.


2
2017-08-24 10:58