创建数组的随机切片以分配给另一个对象数组

Posted

技术标签:

【中文标题】创建数组的随机切片以分配给另一个对象数组【英文标题】:create random slices of an array to assign to another array of objects 【发布时间】:2021-07-27 05:48:33 【问题描述】:

我正在创建 Mongoose 种子并创建“宠物”文档。对于我的数据库中的每个避难所(20 个文档),我想插入在我的代码的第一行中创建的宠物数组的随机数。

我希望得到:

1 号收容所: 狗:["dog.id1", "dog.id18"] ...20 号收容所: 狗:["dog.id14", "dog.id2", "dog.id17" ]

这些宠物的数量和 ID 是随机的。

我已经尝试使用下面的代码,但是:虽然我没有收到任何错误,但我只得到了前两个带有“狗”的庇护所,其余的显示为空白:像这样:

1 号收容所: 狗:["dog.id1", "dog.id18"] ,2 号收容所: 狗:["dog.id2"] ...收容所 3-20: 狗:[ ]

我猜问题出在地图功能和我正在做的金额分配上。

const shelterPromises = shelters
    .map((shelter) => 
      const petAmount = randomNumber(1, 10);
      const randomPets = pets.slice(prevIndex, petAmount);
      
      if (randomPets.length) 
        prevIndex = prevIndex + petAmount;
        return ShelterModel.findByIdAndUpdate(shelter._id, 
          dogs: randomPets
        );
      

      return null;
    )
    .filter(Boolean);

  await Promise.all(shelterPromises);
  console.info('> shelters updated!');
;

我的完整代码如下:

const faker = require('faker');

const PetModel = require('../models/Pets');
const ShelterModel = require('../models/Shelter');

const randomNumber = (min, max) =>
  Math.floor(Math.random() * (max - min)) + min;

const randomArray = (array) => array[Math.floor(Math.random() * array.length)];

const randomMonthYear = ['Month', 'Year'];
const randomBreed = [
  'Collie',
  'Podenco',
  'Breton',
  'Mestizo',
  'German Sheperd',
  'Akbash',
  'Husky',
  'Golden Retriever',
  'Basset Hound'
];

const createPets = async (rowsCount) => 
  const pets = [];

  for (let i = 0; i < rowsCount; i++) 
    const 
      name:  firstName ,
      lorem:  paragraph ,
      image:  animals ,
      date:  past 
     = faker;

    const name = firstName();
    const age = randomNumber(1, 20).toString();
    const ageMonthYear = randomArray(randomMonthYear);
    const weight = randomNumber(1, 80).toString();
    const img = animals();
    const breed = randomArray(randomBreed);
    const dateArrivalInShelter = past();
    const about = paragraph();

    pets.push(
      new PetModel(
        name,
        age,
        ageMonthYear,
        weight,
        img,
        breed,
        dateArrivalInShelter,
        about
      )
    );
  

  await PetModel.insertMany(pets);

  console.info('> pets created!');

  const shelters = await ShelterModel.find();
  let prevIndex = 0;

  const shelterPromises = shelters
    .map((shelter) => 
      const petAmount = randomNumber(1, 10);
      const randomPets = pets.slice(prevIndex, petAmount);
      
      if (randomPets.length) 
        prevIndex = prevIndex + petAmount;
        return ShelterModel.findByIdAndUpdate(shelter._id, 
          dogs: randomPets
        );
      

      return null;
    )
    .filter(Boolean);

  await Promise.all(shelterPromises);
  console.info('> shelters updated!');
;

const dropPets = async () => 
  await PetModel.deleteMany();

  console.info('> pets collection deleted!');
;

module.exports = 
  createPets,
  dropPets
;

【问题讨论】:

【参考方案1】:

因为您的prevIndexprevIndex = prevIndex + petAmount 处增加,但petAmount 始终在1-&gt;10 范围内,所以经过一些循环后,prevIndex 将大于petAmount,而pets.slice(prevIndex, petAmount) 将只返回一个空数组.要解决此问题,您可以将代码更改为:

const randomPets = pets.slice(prevIndex, prevIndex + petAmount);

【讨论】:

以上是关于创建数组的随机切片以分配给另一个对象数组的主要内容,如果未能解决你的问题,请参考以下文章

如何将一个对象数组的一个属性的值分配给另一个对象数组的同名属性? - Javascript

如何一次循环遍历 2 个数组并将数组中的颜色分配给另一个数组的每个值

第六章:随机化(续2)

数据分析2 numpy(ndarray数组,属性,创建,索引切片,运算,函数,随机数), Pandas(Series创建,缺失值处理,特性,索引,DataFrame)

用另一个数组的值随机分配数组值

Go 切片