【问题标题】:Generate an array with random data without using a for loop在不使用 for 循环的情况下生成包含随机数据的数组
【发布时间】:2017-03-17 15:42:55
【问题描述】:

我正在使用faker.js 库来生成随机数据,并且我有几个工厂函数可以生成一系列用户数据:

const createUser = () => {
  return {
    name: faker.name.findName(),
    email: faker.internet.email(),
    address: faker.address.streetAddress(),
    bio: faker.lorem.sentence(),
    image: faker.image.avatar(),
  };
};

const createUsers = (numUsers = 5) => {
  return Array(numUsers).fill(createUser());
};

let fakeUsers = createUsers(5);
console.log(fakeUsers);

这种Array.fill 方法的问题在于它返回相同数据n 的次数。我希望 5 不同的用户从我的工厂返回。

我该怎么做?

【问题讨论】:

  • 填充一个虚拟值然后.map(createUser)
  • 为什么不想使用循环?
  • 没有理由 - 只是想知道用 Array.fill 做事的替代方法
  • 抛开数组函子,在 JS 中循环还有很多其他方法。你甚至可以递归地完成这项工作。
  • 你能发布一个使用递归的例子吗?

标签: javascript arrays factory factory-pattern faker


【解决方案1】:

Array.from 允许您创建一个数组并使用从回调函数返回的值一步进行初始化:

const createUsers = (numUsers = 5) => {
    return Array.from({length: numUsers}, createUser);
}

【讨论】:

  • 没有空的填充,没有地图,这正是应该做的。谢谢!
【解决方案2】:

创建一个带空格的数组,然后使用.map()创建用户:

const createUsers = (numUsers = 5) => {
    return Array(numUsers)
        .fill(null)
        .map(createUser);
}

【讨论】:

    【解决方案3】:

    通过 Array 构造函数创建一个数组将产生一个不可映射(或可迭代)数组。

    发生这种情况是因为构造函数会给你一个包含 X 个未初始化值的数组,导致 ma​​p 失败。使用 fill 初始化值,即使初始化为 nullundefined,也可以:

    const createUser = () => {
      return {
        name: faker.name.findName(),
        email: faker.internet.email(),
        address: faker.address.streetAddress(),
        bio: faker.lorem.sentence(),
        image: faker.image.avatar()
      }
    }
    
    const createUsers = (numUsers = 5) => {
      return new Array(numUsers)
        .fill(undefined)
        .map(createUser);
    }
    
    let fakeUsers = createUsers(5)
    console.log(fakeUsers)
    

    https://jsbin.com/punesorico/edit?html,js,console

    【讨论】:

    • 很好的解释
    【解决方案4】:

    这是通过 TCO 递归函数完成这项工作的另一种方法;

    function getFakeObject(){
      return Array(5).fill()
                     .reduce(o => Object.assign(o,{[String.fromCharCode(...Array(5).fill().map(_ => ~~(Math.random()*26)+65))] : String.fromCharCode(...Array(5).fill().map(_ => ~~(Math.random()*26)+97))}),{});
    }
    
    function makeFakeObjectsArray(n, r = []){
     return n ? makeFakeObjectsArray(n-1,(r.push(getFakeObject()),r)) : r;
    }
    
    console.log(makeFakeObjectsArray(5));

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-04
      • 2012-11-06
      • 2013-10-11
      • 2020-02-26
      • 2023-02-05
      • 2013-02-08
      相关资源
      最近更新 更多