Ответ 1
Можно создать пустой массив, заполнить его (иначе карта пропустит его), а затем сопоставить индексы со значениями:
Array(8).fill().map((_, i) => i * i);
Каков наилучший способ сделать это более функционально (с 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;
поэтому идея действительно заключалась в сокращении числа временных переменных и процедурных ощущений.
Можно создать пустой массив, заполнить его (иначе карта пропустит его), а затем сопоставить индексы со значениями:
Array(8).fill().map((_, i) => i * i);
Предупреждение: К сожалению, я полагаю, что на большинстве популярных платформ отсутствует поддержка пониманий. Смотрите ниже хорошо поддерживаемый метод 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
Хороший способ сделать это любым из:
[...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]
Вот подход с использованием генераторов:
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)