Функциональный подход к построению базовых массивов

javascript functional-programming

395 просмотра

5 ответа

39817 Репутация автора

Это мой код, действующий на myArray:

var myArray = [];
var i;

for(i = 0; i < 20; i += 1) {
   myArray.push(Math.random());
}

Есть ли функциональный эквивалент вышеупомянутого, который обходится без фиктивной переменной i?

Любимые ответы :

  • while(myArray.push(Math.random()) < 20);
  • $.map(Array(20), Math.random);
  • for(var myArray = []; myArray.push(Math.random()) < 20;);
Автор: Randomblue Источник Размещён: 04.08.2012 12:39

Ответы (5)


4 плюса

2589 Репутация автора

Решение

Не в ES5, нет реального функционального эквивалента этому, так как вам нужно что-то, что имеет сумму 20, чтобы применить карту к ...

var my20ElementArray = [0,1,2,3,4,5,6,7,8,9,10];
var myArray = my20ElementArray.map(Math.random);

Вы можете создать функцию, подобную xrange, которая есть в Python, но это просто скрыло бы эту «неиспользуемую» переменную внутри функции.

Автор: Aadaam Размещён: 04.08.2012 12:50

1 плюс

53947 Репутация автора

Вы ищете что-то следующее:

function makeArray(length, def) {
    var array = [];
    var funct = typeof def === "function";
    while (array.push(funct ? def() : def) < length);
    return array;
}

Затем вы можете создать массивы следующим образом:

var array = makeArray(100); // an array of 100 elements
var zero = makeArray(5, 0); // an array of 5 `0`s

В вашем случае вы можете сделать что-то вроде:

var myArray = makeArray(20, Math.random);

Смотрите следующую скрипку: http://jsfiddle.net/WxtkF/3/

Автор: Aadit M Shah Размещён: 04.08.2012 12:58

3 плюса

414505 Репутация автора

С помощью JavaScript 1.7 вы можете использовать массивы для этой задачи:

var myArray = [Math.random() for each (i in range(0, 20))];

Однако в ES5.1 вы можете просто использовать Arrayконструктор для генерации массива произвольной длины, а затем отобразить его на случайные числа. Единственным недостатком является то, что map()он не работает с неинициализированными значениями, поэтому я сначала генерирую массив пустых строк, используя joinи split:

var myArray = new Array(20).join(" ").split(" ").map(Math.random);

Уродливый, но короткий. Возможно, лучшая (но менее понятная) идея из создания диапазона в JavaScript - странный синтаксис :

var myArray = Array.apply(null, {length: 20}).map(Math.random);

Начиная с комментария @FelixKlings, можно также использовать этот однострочный без iпеременной цикла:

for (var myArray=[]; myArray.push(Math.random()) < 20;);
// much better:
for (var myArray=[]; myArray.length < 20;) myArray.push(Math.random());
Автор: Bergi Размещён: 04.08.2012 12:59

0 плюса

86011 Репутация автора

Вы можете попробовать:

var myArray = String(Array(20)).split(',')
               .map( () => Math.random() );

Или дополните прототип Array чем-то вроде:

Array.prototype.vector = function(n,fn){
  fn = fn || function(){return '0';};
  while (n--){
    this.push(fn());
  }
  return this;
}
// usage
var myArray = [].vector(20, () => Math.random());

Или попробуйте что-нибудь смешное:

var myArray = function a(n,fn){
  return n ? a(n-1,fn).concat(fn()) : [];
}(20, () => Math.random())

Или используйте Array.from (ES> = 2015)

Array.from({length: 20}).map(() => Math.random())
Автор: KooiInc Размещён: 04.08.2012 01:11

1 плюс

1107 Репутация автора

как насчет этого?

Это стиль Functionale, и он очень лаконичен.

var makeRandomArray = function(n){
    if (n == 0) return [];
    return [Math.random()].concat(makeRandomArray(n-1));
};

console.log(makeRandomArray(20))

http://jsfiddle.net/YQqGP/

Автор: blueiur Размещён: 05.08.2012 11:23
Вопросы из категории :
32x32