不使用 for 循环生成具有随机数据的数组

问题描述 投票:0回答:5

我正在使用

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
不同的用户从我的工厂返回。

我该怎么做?

javascript arrays factory factory-pattern faker
5个回答
24
投票

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

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

6
投票

创建一个带空格的数组,然后使用

.map()
创建用户:

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

4
投票

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

发生这种情况是因为构造函数会给你一个包含 X 个未初始化值的数组,导致 map 失败。使用 fill 来初始化值,即使初始化为

null
undefined
,也会起作用:

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


1
投票

这是通过 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));


0
投票

从最新版本 (

multiple
) 开始,您现在可以使用
v8.0.0
助手更轻松地执行此操作:

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

faker.helpers.multiple(createUser, { count: 5 })

有关更多信息,请参阅文档:https://fakerjs.dev/api/helpers.html#multiple

© www.soinside.com 2019 - 2024. All rights reserved.