JS - повторить действие N раз без цикла for или while? - PullRequest
0 голосов
/ 12 декабря 2018

Например, я хочу создать некоторый массив данных отладки, и мне нужна функция, которая будет принимать только длину нужного массива и возвращать массив объектов с несколькими реквизитами со случайными значениями данных.

Есть ли способ сделать эту функцию без цикла for?Причина в том, что у меня есть переменная i, которая мне не нужна.

const generateData = (count) => {
  let data = []
  for (let i = 0; i < count; i++)  
    data.push({
      foo: Math.round(Math.random() * 100),
      bar: Math.random() > 0.5
    })
  return data  

}

Ответы [ 5 ]

0 голосов
/ 12 декабря 2018

var timer = null;
		const generateData = (count,cb) => {
		  	let data = [];
		  	var num = 0;
		  	timer = setInterval(function(){
		    	if(num>=count){
		       		clearInterval(timer);
		       		cb(data)
		     	}else{
		      		data.push({
		         		foo: Math.round(Math.random() * 100),
		         		bar: Math.random() > 0.5
		       		})
		       		num++;
		     	}
		  	},10)
		}
		generateData(5,function(data){
			console.log(data)
		})
0 голосов
/ 12 декабря 2018

Вы можете сделать рекурсивную функцию:

const generateData = (count) => {
  let data = []
  function recursive(num) {
    if (num > 1) {
      num--;
      data.push({
        foo: Math.round(Math.random() * 100),
        bar: Math.random() > 0.5
      })
      recursive(num);
    }
    else {
      data.push({
        foo: Math.round(Math.random() * 100),
        bar: Math.random() > 0.5
      })
      return;
    }
  }
  recursive(count);
  return data  

}

Относительно большой, но чрезвычайно простой, чтобы увидеть, что все делает.

0 голосов
/ 12 декабря 2018

Вы можете генерировать массив длиной n и map() для случайных объектов.

const createRandomArray = n => arr = [...Array(n)].map(() => ({
  foo: Math.round(Math.random() * 100),
  bar: Math.random() > 0.5
}));

console.log(createRandomArray(3));
0 голосов
/ 12 декабря 2018

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

    function initArray(amount) {
        return [...new Array(amount)].map(() => ({
            foo: Math.round(Math.random() * 100),
            bar: Math.random() > 0.5
        }));
    }
    console.log(initArray(5));

На самом деле это все еще итеративный, но более функциональный подход.

0 голосов
/ 12 декабря 2018

Вы можете создать массив сразу с помощью Array.from, если хотите, без объявления или использования каких-либо промежуточных имен переменных:

const generateData = length => (
  Array.from(
    { length },
    () => ({
      foo: Math.round(Math.random() * 100),
      bar: Math.random() > 0.5
    })
  )
);
console.log(generateData(5));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...