Превратить цикл Coffeescript с использованием диапазона в ES6

#javascript #arrays #coffeescript #ecmascript-6

#javascript #массивы #coffeescript #ecmascript-6

Вопрос:

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

Этот цикл Coffeescript (написанный кем-то другим)

 if @props.total>1
  for page in [1..@props.total]
    active = (page is  @props.current)
  

является ли, согласно js2coffee, эквивалентом этого JS

 var active, i, page, ref;

if (this.props.total > 1) {
  for (page = i = 1, ref = this.props.total; 1 <= ref ? i <= ref : i >= ref; page = 1 <= ref ?   i : --i) {
    active = page ===  this.props.current;
  }
}
  

Теперь я хотел бы использовать for..of цикл, чтобы сократить этот JS, но я не могу понять, как.

Я пытался реализовать эту идею (бит функции генератора внизу), но я не могу понять это правильно.

Мой вопрос: есть ли способ создания диапазонов в ES6?

Комментарии:

1. function* range Из связанной статьи должно работать (и нет, не так много других способов реализации диапазонов). Пожалуйста, покажите нам точный код, который вы пробовали.

2. Простой for (let page = 1; page < this.props.total; page ) цикл, вероятно, будет самым простым решением. Здесь нет необходимости использовать for of цикл, даже если он эквивалентен циклу Coffeescript for in .

3. … и учитывая, что вы все равно установили active последнее сравнение, вы можете полностью пропустить цикл 🙂

4. подожди, ват? ваш последний комментарий немного сбил меня с толку.

5. Я предполагаю, что у вас на самом деле есть другое тело цикла, которое делает больше, чем просто присваивание active переменной, но фрагмент, который вы нам показали, можно сократить до if (this.props.total > 1) active = this.props.total === this.props.current;

Ответ №1:

Решение генератора, которое вы ищете, будет

 function* range(i, end=Infinity) {
    while (i <= end) {
        yield i  ;
    }
}

// if (this.props.total > 1) - implicitly done by `range`
for (let page of range(1, this.props.total) {
    active = page ===  this.props.current;
}
  

Ответ №2:

Для генерации любого диапазона последовательных целых чисел длины k , начинающегося с n в JavaScript, должно работать следующее:

 Array.apply(null, Array(k)).map((x, i) => i   n);
  

Хотя это не совсем то же самое, что функциональность диапазона coffeescript, она, вероятно, достаточно близка для большинства применений. Кроме того, несмотря на то, что он значительно более подробный, он имеет одно решительное преимущество: вам не нужно запоминать, какой из .. и ... является эксклюзивным, а какой инклюзивным.