Я всегда обнаруживал, что range
функция отсутствует в JavaScript, поскольку она доступна в Python и других? Есть ли краткий способ сгенерировать диапазон чисел в ES2015?
РЕДАКТИРОВАТЬ: МОЙ вопрос отличается от упомянутого дубликата, поскольку он относится к ES2015, а не к ECMASCRIPT-5. Также мне нужно, чтобы диапазон начинался с 0, а не с конкретного начального номера (хотя было бы хорошо, если бы он был там)
javascript
arrays
ecmascript-6
Адитья Сингх
источник
источник
[...Array(n).keys()]
.[...Array(5)].map((_,i) => i+1)
Ответы:
Вы можете использовать оператор распространения для ключей только что созданного массива.
[...Array(n).keys()]
или
Array.from(Array(n).keys())
Array.from()
Синтаксис необходим при работе с машинописьюисточник
function range (start, end) { return [...Array(1+end-start).keys()].map(v => start+v) }
Array.from(Array(n).keys())
.[...Array(n).keys()]
не работает в Typescript? Является ли это преднамеренным отклонением от других реализаций JS?Array(5).keys().slice()
а slice не является методом итератора массива. Вот пример того, что это не работает typescriptlang.org/play/…Я также нашел еще один интуитивно понятный способ
Array.from
:Теперь эта
range
функция вернет все числа от 0 до n-1.Модифицированная версия диапазона для поддержки
start
иend
является:EDIT Как было предложено @ marco6, вы можете поместить это как статический метод , если он подходит для вашего случая использования
и использовать его как
источник
interface ArrayConstructor { range(n: number): number[]; }
Array.range = n => Array.from({length: n}, (value, key) => key);
А потом вездеArray.range(x)...
[ts] Property 'range' does not exist on type 'ArrayConstructor'
, thouths?С Дельтой
Для javascript
Для машинописного текста
Обновить
редактировать
источник
Array.from(Array(~~((to - from) / step) + 1).keys())
Для чисел от 0 до 5
источник
Многие из этих решений основаны на создании экземпляров реальных объектов Array, которые могут выполнять работу во многих случаях, но не могут поддерживать такие случаи, как
range(Infinity)
. Вы можете использовать простой генератор, чтобы избежать этих проблем и поддерживать бесконечные последовательности:Примеры:
источник
Итак, в этом случае было бы неплохо, если бы объект Number вел себя как объект Array с оператором распространения.
Например, объект Array, используемый с оператором распространения:
Это работает так, потому что объект Array имеет встроенный итератор.
В нашем случае нам нужен объект Number для аналогичной функциональности:
Для этого мы можем просто создать для этой цели числовой итератор.
Теперь с помощью оператора распространения можно создавать диапазоны от 0 до N.
http://jsfiddle.net/01e4xdv5/4/
Приветствия.
источник
Вы можете использовать функцию генератора, которая лениво создает диапазон только при необходимости:
Вы можете использовать функцию генератора более высокого порядка для сопоставления с
range
генератором:Если вы бесстрашны, вы можете даже обобщить подход генератора для решения гораздо более широкого круга задач (каламбур):
Имейте в виду, что генераторы / итераторы по своей сути сохраняют состояние, то есть неявное изменение состояния происходит при каждом вызове
next
. Состояние - неоднозначное благо.источник
Диапазон с шагом ES6, который работает аналогично python
list(range(start, stop[, step]))
:Примеры:
источник
Для поддержки дельты
источник
Вы также можете сделать это с одинарным вкладышем со ступенчатой опорой, например:
((from, to, step) => ((add, arr, v) => add(arr, v, add))((arr, v, add) => v < to ? add(arr.concat([v]), v + step, add) : arr, [], from))(0, 10, 1)
Результат есть
[0, 1, 2, 3, 4, 5, 6 ,7 ,8 ,9]
.источник
Эта функция вернет целочисленную последовательность.
источник
в машинописном тексте
источник
Array.from
и распространять синтаксис. И тогда это точно так же, как существующий ответ.[...Array(n).keys()]
это не работает в Typescript.Array.from(Array(n).keys())
. Я почти уверен, что это должно сработать, к чему переносится литерал с синтаксисом распространения?Вот еще один вариант, который не используется
Array
.источник
Генераторы теперь позволяют вам лениво генерировать числовые последовательности и использовать меньше памяти для больших диапазонов.
Хотя в вопросе конкретно говорится о ES2015, я ожидаю, что здесь окажется много пользователей Typescript, и переход на ES прост ...
Первые два объявления функций предназначены только для предоставления более информативных предложений завершения в вашей среде IDE.
источник
Как насчет картографирования ....
Array (n) .map ((value, index) ....) находится на 80% пути туда. Но по какой-то непонятной причине не работает. Но есть обходной путь.
Для диапазона
Как ни странно, эти два итератора возвращают один и тот же результат:
Array(end-start+1).entries()
иArray(end-start+1).fill().entries()
источник