it-swarm.com.ru

функциональный способ перебора диапазона (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 div, (не проверено)

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

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

97
bsr

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

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

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]

59
Downgoat

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

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)
15
user663031