Функция JavaScript похожа на диапазон Python () - PullRequest
72 голосов
/ 25 ноября 2011

Есть ли в JavaScript функция, похожая на Python range()?

Я думаю, что должен быть лучший способ, чем каждый раз писать следующие строки:

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

Ответы [ 17 ]

3 голосов
/ 23 февраля 2016

Уточнено с параметрами по умолчанию ES6.

let range = function*(start = 0, stop, step = 1) {
  let cur = (stop === undefined) ? 0 : start;
  let max = (stop === undefined) ? start : stop;
  for (let i = cur; step < 0 ? i > max : i < max; i += step)
    yield i
}
2 голосов
/ 24 августа 2014

Вы можете использовать библиотеку подчеркивания . Он содержит десятки полезных функций для работы с массивами и многое другое.

1 голос
/ 04 апреля 2018

pythonic имитирует поведение Python range наилучшим образом, используя генераторы JS (yield), поддерживающие варианты использования range(stop) и range(start, stop, step). Кроме того, функция pythonic range возвращает пользовательский встроенный объект Generator, который поддерживает map и filter, так что можно создать такие однострочные строки, как:

import {range} from 'pythonic';
// ...
const results = range(5).map(wouldBeInvokedFiveTimes);
// `results` is now an array containing elements from
// 5 calls to wouldBeInvokedFiveTimes

Установка с использованием npm:

npm install --save pythonic

Вот код в pythonic для диапазона:

function range(...args) {
    if (args.length < 2) {
        return new Generator(rangeGeneratorWithStop(...args));
    }
    return new Generator(rangeGeneratorWithSartAndStopAndStep(...args));
}

const rangeGeneratorWithStop = stop => function * () {
    for (let i = 0; i < stop; i++) {
        yield i;
    }
};

const rangeGeneratorWithSartAndStopAndStep = (start, stop, step = 1) => function * () {
    for (let i = start; i < stop; i += step) {
        yield i;
    }
};

function range(...args) {
    if (args.length < 2) {
        return new Generator(rangeGeneratorWithStop(...args));
    }
    return new Generator(rangeGeneratorWithSartAndStopAndStep(...args));
}

class Generator {
    constructor(generatorFn) {
        this[Symbol.iterator] = generatorFn;
    }

    map(callbackFn) {
        const result = [];
        for (const element of this) {
            result.push(callbackFn(element));
        }
        return result;
    }

    filter(callbackFn) {
        const result = [];
        for (const element of this) {
            if (callbackFn(element)) {
                result.push(element);
            }
        }
        return result;
    }

    toArray() {
        return Array.from(this);
    }
}

Раскрытие информации Я автор и сопровождающий Pythonic

0 голосов
/ 26 мая 2019

Нет, их нет, но вы можете их создать.

Я неравнодушен к поведению диапазона в Python3.Ниже вы найдете реализацию JavaScript Python range ():

function* range(start=0, end=undefined, step=1) {    
    if(arguments.length === 1) {end = start, start = 0}    
    
    [...arguments].forEach(arg => {    
        if( typeof arg !== 'number') {throw new TypeError("Invalid argument")}                               
    })    
    if(arguments.length === 0) {throw new TypeError("More arguments neede")}    
        
    if(start >= end) return                                                                                                                                     
    yield start    
    yield* range(start + step, end, step)    
}    
         
// Use Cases
console.log([...range(5)])

console.log([...range(2, 5)])

console.log([...range(2, 5, 2)])
console.log([...range(2,3)])
// You can, of course, iterate through the range instance.
0 голосов
/ 22 апреля 2019

MDN рекомендует такой подход: Генератор последовательности (диапазон)

0 голосов
/ 08 января 2018

Вот еще одна es6 реализация диапазона

// range :: (from, to, step?) -> [Number]
const range = (from, to, step = 1) => {
  //swap values if necesery
  [from, to] = from > to ? [to, from] : [from, to]
  //create range array
  return [...Array(Math.round((to - from) / step))]
    .map((_, index) => {
      const negative = from < 0 ? Math.abs(from) : 0
      return index < negative ? 
        from + index * step  :
        (index - negative + 1) * step
    })
}  

range(-20, 0, 5)
  .forEach(val => console.log(val))

for(const val of range(5, 1)){
   console.log(`value ${val}`)
}
0 голосов
/ 11 августа 2016

По-прежнему нет встроенной функции, эквивалентной range(), но с самой последней версией - ES2015 - вы можете создать свою собственную реализацию. Вот ограниченная версия этого. Ограничено, поскольку не учитывает параметр шага. Просто мин, макс.

const range = (min = null, max = null) => Array.from({length:max ? max - min : min}, (v,k) => max ? k + min : k)

Это достигается с помощью метода Array.from, способного построить массив из любого объекта, обладающего свойством length. Таким образом, передача простого объекта с помощью свойства length создаст ArrayIterator, который выдаст length количество объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...