Функциональный способ итерации по диапазону (ES6/7)

Каков наилучший способ сделать это более функционально (с ES6/ES7)

let cols = [];
for (let i =0; i <= 7; i++) {
   cols.push(i * i);
}
return cols;

Я пробовал,

return [ ...7 ].map(i => {
  return i * i;
});

но это переводится на

[].concat(7).map(function (n) {
  return n * n;
});

что я не ожидал.

РЕДАКТИРОВАТЬ:

@pavlo. Действительно, это была ошибка. Я использовал JSX, и, например, я хочу 7 divs (untested)

let cols = [];
    for (let i =0; i <= 7; i++) {
       cols.push(<div id={i}> ...  </div>)
    }
    return cols;

поэтому идея действительно заключалась в сокращении числа временных переменных и процедурных ощущений.

Ответ 1

Можно создать пустой массив, заполнить его (иначе карта пропустит его), а затем сопоставить индексы со значениями:

Array(8).fill().map((_, i) => i * i);

Ответ 2

ES7 Предложение

Предупреждение: К сожалению, я полагаю, что на большинстве популярных платформ отсутствует поддержка пониманий. Смотрите ниже хорошо поддерживаемый метод ES6

Вы всегда можете использовать что-то вроде:

[for (i of Array(7).keys()) i*i];

Запуск этого кода в Firefox:

[0, 1, 4, 9, 16, 25, 36]

Это работает на Firefox (это была предложенная функция ES7), но оно было исключено из спецификации. IIRC, Babel 5 с "экспериментальной" поддержкой поддерживает это.

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

var range = (u, l = 0) => [ for( i of Array(u - l).keys() ) i + l ]

Тогда вы можете сделать:

[for (i of range(5)) i*i] // 0, 1, 4, 9, 16, 25
[for (i of range(5,3)) i*i] // 9, 16, 25

ES6

Хороший способ сделать это любым из:

[...Array(7).keys()].map(i => i * i);
Array(7).fill().map((_,i) => i*i);
[...Array(7)].map((_,i) => i*i);

Это выведет:

[0, 1, 4, 9, 16, 25, 36]

Ответ 3

Вот подход с использованием генераторов:

function* square(n) {
    for (var i = 0; i < n; i++ ) yield i*i;
}

Тогда вы можете написать

console.log(...square(7));

Другая идея:

[...Array(5)].map((_, i) => i*i)

Array(5) создает незаполненный массив из пяти элементов. Вот как работает Array когда ему дается один аргумент. Мы используем оператор распространения, чтобы создать массив с пятью неопределенными элементами. Что мы можем затем карту. Смотрите http://ariya.ofilabs.com/2013/07/sequence-using-javascript-array.html.

В качестве альтернативы мы могли бы написать

Array.from(Array(5)).map((_, i) => i*i)

или мы можем воспользоваться вторым аргументом Array#from чтобы пропустить map и написать

Array.from(Array(5), (_, i) => i*i)

Ужасный взлом, который я видел недавно, который я не рекомендую вам использовать,

[...1e4+''].map((_, i) => i*i)