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

Generate an array with random data without using a for loop

我正在使用 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 方法的问题在于它 returns 相同的数据 n 次。我希望 5 个不同的用户从我的工厂返回。

我该怎么做?

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

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

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

发生这种情况是因为构造函数会给你一个包含 X 个未初始化值的数组,导致 map 失败。使用 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

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

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

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