2017-03-17 55 views
2

我使用faker.js库生成随机数据,我有一对夫妇的产生的一系列用户数据的工厂函数:生成随机数据的数组,而无需使用一个for循环

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)'。 –

+1

为什么你不想使用循环? – JJJ

+0

没有理由 - 只是想知道使用Array.fill处理事务的替代方法 –

回答

3

Array.from允许创建一个阵列,并用值初始化它从一个回调函数在一个步骤中返回:

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

创建空白的阵列,然后用.map()创建用户:

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

创建经由Array构造的阵列将产生非可映射(或迭代为此事)阵列。

发生这种情况是因为构造函数会为您提供一个包含X个未初始化值的数组,导致地图失败。使用填写初始化值,即使初始化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

+0

很好的解释 –

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