JS - 不使用 for 或 while 循环重复执行 N 次操作?

4
例如,我想创建一些调试数据数组,并且需要一个函数,该函数仅接受所需数组的长度并返回带有随机数据值的几个属性的对象数组。
有没有一种方法可以不使用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个回答

6

如果您想的话,可以使用Array.from一次性创建数组,无需声明或使用任何中间变量名称:

const generateData = length => (
  Array.from(
    { length },
    () => ({
      foo: Math.round(Math.random() * 100),
      bar: Math.random() > 0.5
    })
  )
);
console.log(generateData(5));


我喜欢那个。谢谢! - stdnik
@JaromandaX,OP 没有说不用循环,他说不用 for 循环。 - Tyler Roper
等等,Array.from() 在只有 length 属性的对象上也能工作?我不知道是否愿意使用它,但这很酷! - solarshado

5

不必将每次迭代推入目标数组,您可以一次创建所需大小的数组,然后按照需要将每个项目映射到随机初始化值。

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

实际上,这仍然是一个迭代过程,但采用更具功能性的方法。


2
代码很好,但如果您能为那些遇到它的人添加一些解释,那就更好了。 - Tyler Roper
你为什么要将一个新数组(...)扩展到一个数组字面量中?我不知道有什么特别的原因,使用new Array(amount).map(...)不是同样好用/更好吗? - solarshado

1
你可以生成一个长度为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

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

你可以用递归函数实现:

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  

}

相对较大,但非常简单易懂,可以清楚地看到每个部分的作用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接