不使用for循环生成一个包含随机数据的数组

15

我正在使用 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 个用户。如何做到这一点?

3
用虚拟值填充,然后执行.map(createUser) - Fabian Klötzl
1
为什么你不想使用循环? - JJJ
1
没有特定原因,只是想了解使用Array.fill的其他方法。 - Amit Erandole
1
除了数组函数,JavaScript 中还有很多其他循环的方法。您甚至可以通过递归来完成此工作。 - Redu
你能否发布一个使用递归的示例? - Amit Erandole
5个回答

30

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

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

无空填充,无地图,只需准确执行。谢谢! - Machado

7
创建一个空数组,然后使用 .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


很好的解释 - Amit Erandole

4

最新版本(v8.0.0)已经可以通过multiple助手更轻松地完成此操作:

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


nameaddress已被弃用,请使用personlocation分别代替。 取代name.findName()使用person.fullName() 取代address.streetAddress()使用location.streetAddress() - undefined

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));


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