В PHP вы можете сделать ...
range(1, 3); // Array(1, 2, 3)
range("A", "C"); // Array("A", "B", "C")
То есть есть функция, которая позволяет вам получать диапазон чисел или символов, передавая верхнюю и нижнюю границы.
Есть ли что-нибудь встроенное в JavaScript для этого? Если нет, как бы я это реализовал?
$R
функция, но, на самом деле, я так не думаю.Array.from("ABC") //['A', 'B', 'C']
Это самая близкая вещь, которую я могу найти для второй части вопроса.split("")
тамArray.apply(null, { length: 10 }).map(eval.call, Number)
Ответы:
чисел
Итерация персонажа
итерация
Как функции
Как типизированные функции
_.range()
функция lodash.jsСтарые не es6 браузеры без библиотеки:
(Кредит ES6 Нилсу Петерсону и другим комментаторам)
источник
(new Array(5)).map(function (value, index) { return index; })
не сработает? Это возвращается[undefined × 5]
для меня в Chrome DevTools.map()
одним из его друзей.Array(5).fill()
также сопоставимоДля чисел вы можете использовать ES6
Array.from()
, который работает во все эти дни, кроме IE:Укороченная версия:
Более длинная версия:
который создает массив от 0 до 19 включительно. Это может быть сокращено до одной из следующих форм:
Также можно указать нижнюю и верхнюю границы, например:
Статья, описывающая это более подробно: http://www.2ality.com/2014/05/es6-array-methods.html
источник
Array.from()
метод, и быстрее, чем оба:Array(20).fill().map((_, i) => i)
Array.from({length: end - start}, (v, k) => k + start)
undefined
, поэтомуfill()
(без аргумента) сам по себе не ошибается . Значение заполнения не используется в этом решении, поэтому, если хотите, вы можете использовать,fill(0)
чтобы сохранить несколько символов.Моя новая любимая форма ( ES2015 )
И если вам нужна функция с
step
параметром:источник
stop
на самом деле это не стоп / конечная позиция, а счет / расстояние. (без обид, просто чтобы люди знали обArray(Math.ceil((stop - start) / step) + 1)
, нуждается+1
в конце, чтобы действительно имитировать "включающее" поведение php.range
метод. Все остальные над этим (кроме lodash_.range
) реализуют базовые итераторы, а не фактическую функцию range с start, stop и stepВот мои 2 цента:
источник
Это работает для символов и чисел, идущих вперед или назад с дополнительным шагом.
jsFiddle .
Если вам подходит расширение родных типов, присвойте его
Array.range
.Показать фрагмент кода
источник
Простая функция диапазона:
Для включения типа данных BitInt может быть включена некоторая проверка, гарантирующая, что все переменные одинаковы
typeof start
:Чтобы удалить значения выше, чем определено,
stop
например,range(0,5,2)
будет включать6
, что не должно быть.источник
step != 1
, тоwhile
условие необходимо приниматьstep
во внимание. Моя обновленная версия соstep
значением по умолчанию : диапазон функций (начало, остановка, шаг) {шаг = шаг || 1 var a = [start], b = start; while ((b + step) <stop) {console.log ("b:" + b + ". a:" + a + "."); Ь + = шаг; a.push (б); } return a; }(step || 1)
.источник
Array
прототип.undefined method toUpperCase to etc
:!Хорошо, в JavaScript у нас нет такой
range()
функции, как PHP , поэтому нам нужно создать эту функцию, что довольно просто, я пишу пару однострочных функций для вас и разделяю их для чисел и алфавитов, как показано ниже:для номеров :
и назовите это как:
для алфавитов :
и назовите это как:
источник
Array(end - start + 1)
иArray(end.charCodeAt(0) - start.charCodeAt(0) + 1)
.Удобная функция, чтобы сделать трюк, запустите фрагмент кода ниже
вот как это использовать
диапазон (начало, конец, шаг = 1, смещение = 0);
range(5,10) // [5, 6, 7, 8, 9, 10]
range(10,5) // [10, 9, 8, 7, 6, 5]
range(10,2,2) // [10, 8, 6, 4, 2]
range(5,10,0,-1) // [6, 7, 8, 9] not 5,10 themselves
range(5,10,0,1) // [4, 5, 6, 7, 8, 9, 10, 11]
range(5,10,0,-2) // [7, 8]
range(10,0,2,2) // [12, 10, 8, 6, 4, 2, 0, -2]
Надеюсь, что вы найдете ее полезной.
И вот как это работает.
В основном я сначала вычисляю длину полученного массива и создаю массив с нулевой заливкой до этой длины, затем заполняю его необходимыми значениями
(step || 1)
=> И другие, как это означает использовать значение,step
и если оно не было предоставлено использовать1
вместо(Math.abs(end - start) + ((offset || 0) * 2)) / (step || 1) + 1)
чтобы упростить его (разница * смещение в обоих направлениях / шагах)new Array(length).fill(0);
здесь проверку[0,0,0,..]
той длины, которую мы хотим. Мы отображаем его и возвращаем новый массив со значениями, которые нам нужны, используяArray.map(function() {})
var direction = start < end ? 1 : 0;
Очевидно, еслиstart
не меньше, чемend
мы должны двигаться назад. Я имею в виду переход от 0 до 5 или наоборотstartingPoint
+stepSize
* На каждой итерацииindex
дает нам значение, которое нам нужноисточник
источник
_
это просто имя аргумента в обратном вызове сопоставления. Знаете, в некоторых языках вы бы использовали имя_
в качестве имени, чтобы указать, что переменная не используется._
не передаются аргументы дляrange
. Почему бы нет?Использование оператора спреда Harmony и функций стрелок:
Пример:
источник
--- ОБНОВЛЕНИЕ (Спасибо @lokhmakov за упрощение) ---
Другая версия, использующая генераторы ES6 (см. Отличный ответ Паоло Моретти с генераторами ES6 ):
Или, если нам нужна только итерация, то:
--- ОРИГИНАЛЬНЫЙ код был: ---
а также
источник
const range = (x, y) => Array.from(function* () { while (x <= y) yield x++; }())
Сделал некоторые исследования некоторых различных функций диапазона. Посмотрите в jsperf сравнение различных способов выполнения этих функций. Конечно, не идеальный или исчерпывающий список, но должен помочь :)
Победитель...
Технически это не самая быстрая на Firefox, но сумасшедшая разница в скорости (imho) на Chrome компенсирует это.
Также интересно наблюдать, насколько Chrome работает с этими функциями массива быстрее, чем Firefox. Хром как минимум в 4 или 5 раз быстрее .
источник
Стандартный Javascript не имеет встроенной функции для генерации диапазонов. Некоторые фреймворки javascript добавляют поддержку таких функций, или, как уже отмечали другие, вы всегда можете свернуть свои собственные.
Если вы хотите перепроверить, основным ресурсом является стандарт ECMA-262 .
источник
Вы можете использовать lodash или Undescore.js
range
:В качестве альтернативы, если вам нужен только последовательный диапазон целых чисел, вы можете сделать что-то вроде:
В ES6
range
могут быть реализованы генераторы :Эта реализация экономит память при итерации больших последовательностей, поскольку ей не нужно материализовать все значения в массиве:
источник
Array.from
для преобразования генераторов в экземпляры массивов и проверки выходных данных.Интересной задачей было бы написать самую короткую функцию для этого. Рекурс на помощь!
На больших диапазонах работает медленно, но, к счастью, квантовые компьютеры не за горами.
Дополнительным бонусом является то, что это запутывает. Потому что мы все знаем, как важно скрыть наш код от посторонних глаз.
Чтобы по-настоящему и полностью запутать функцию, сделайте это:
источник
const range = (a, b) => (a>=b) ? [] : [a, ...range(a+1, b)]
с использованием синтаксисаconst range = (a, b, Δ = 1) => (a > b) ? [] : [a, ...range(a + Δ, b, Δ)];
. Также выслушав весь ответ за комментарий.Это может быть не лучшим способом. Но если вы хотите получить диапазон чисел в одной строке кода. Например 10 - 50
Где 40 (конец - начало) и 10 - начало. Это должно вернуть [10, 11, ..., 50]
источник
Я хотел бы написать что-то вроде этого:
Он ведет себя аналогично диапазону Python:
источник
Довольно минималистичная реализация, в которой интенсивно используется ES6, может быть создана следующим образом, обратив особое внимание на
Array.from()
статический метод:источник
getRange()
своего рода «расширенную» функцию. В частности, я стремился охватить крайние случаи, которые могут быть рассмотрены без изменений в приведенном выше варианте. Кроме того, я добавил поддержку буквенно-цифровых диапазонов. Другими словами, вызов его с помощью двух предоставленных входных данных, таких как'C'
и'K'
(в этом порядке), возвращает массив, значения которого представляют собой последовательный набор символов от буквы «C» (включительно) до буквы «K» (getRange('C', 'K'); // => ["C", "D", "E", "F", "G", "H", "I", "J"]
new
ключевое словоrange(start,end,step)
: С итераторами ES6Вы запрашиваете только верхнюю и нижнюю границы. Здесь мы создаем один шаг тоже.
Вы можете легко создать
range()
функцию генератора, которая может функционировать как итератор. Это означает, что вам не нужно предварительно генерировать весь массив.Теперь вы можете захотеть создать что-то, что предварительно сгенерирует массив из итератора и вернет список. Это полезно для функций, которые принимают массив. Для этого мы можем использовать
Array.from()
Теперь вы можете легко создать статический массив,
Но когда что-то требует итератор (или дает вам возможность использовать итератор), вы также можете легко его создать.
Особые заметки
R.range
как и у Lodashисточник
Хотя это не из PHP , но имитация
range
из Python .источник
Что касается генерации числового массива для заданного диапазона, я использую это:
Очевидно, это не будет работать для алфавитных массивов.
источник
array = []
внутри цикла может не дать вам то, что вы хотите.[5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
, я бы ожидал только первую половину этого массива.Использование генераторов Harmony , поддерживаемых всеми браузерами, кроме IE11 :
Примеры
принимать
Пример 1
take
занимает столько, сколько он может получитьtake(10, range( {from: 100, step: 5, to: 120} ) )
возвращается
[100, 105, 110, 115, 120]
Пример 2
to
не обязательноtake(10, range( {from: 100, step: 5} ) )
возвращается
[100, 105, 110, 115, 120, 125, 130, 135, 140, 145]
взять все
Пример 3
from
не обязательноtakeAll( range( {to: 5} ) )
возвращается
[0, 1, 2, 3, 4, 5]
Пример 4
takeAll( range( {to: 500, step: 100} ) )
возвращается
[0, 100, 200, 300, 400, 500]
Пример 5
takeAll( range( {from: 'z', to: 'a'} ) )
возвращается
["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"]
источник
for
улучшило бы удобочитаемость.... больше диапазона, используя функцию генератора.
Надеюсь, это полезно.
источник
Мой коллега по кегельфингу придумал это (ES6) включительно:
не включительно:
источник
Вы можете использовать
lodash
функцию_.range(10)
https://lodash.com/docs#rangeисточник
У d3 также есть встроенная функция дальности. См. Https://github.com/mbostock/d3/wiki/Arrays#d3_range :
Пример:
источник
Завершите реализацию ES6, используя подпись range ([start,] stop [, step]):
Если вы хотите автоматический отрицательный шаг, добавьте
Или более минималистично:
Если у вас огромные диапазоны, посмотрите на генераторный подход Паоло Моретти
источник
!stop
наtypeof stop === 'undefined'
, затем заменитеint
наMath.floor
и добавьте проверкуif (start > stop && step > 0)
(в противном случаеrange(-3, -10)
выдает исключение вместо того, чтобы делать что-то вменяемое (либо щелкает знак шага, либо возвращается[]
)). В противном случае, хорошо!Там в модуль НПМ Bereich для этого ( «Bereich» является немецкое слово «диапазон»). Он использует современные итераторы JavaScript, поэтому вы можете использовать его различными способами, такими как:
Он также поддерживает нисходящие диапазоны (путем простого обмена
min
иmax
), а также поддерживает шаги, отличные от1
.Отказ от ответственности: я являюсь автором этого модуля, поэтому, пожалуйста, примите мой ответ с недоверием.
источник
Этот работает также в обратном порядке.
источник