【问题标题】:How do I randomly select an object from an array multiple times and store each in an array?如何多次从数组中随机选择一个对象并将每个对象存储在一个数组中?
【发布时间】:2019-12-03 03:13:42
【问题描述】:

我正在尝试使用一个函数从对象数组中拉出一个对象,该函数根据我预设的一些规则随机化选择的对象(每个对象都有一个从 0 到 1 的上限和下限,控制其“机会”被选中。

我想多次运行这个函数并将每个单独调用的结果存储在一个新数组中。

下面是我写的代码。它生成规定数量的不同对象,但是我尝试构建这些对象的数组的部分只是将多个相同的调用推入数组,因此我最终得到一个充满我随机拉出的相同对象的数组。

const animals = [
  {
    upperProb: 1,
    lowerProb: 0.8,
    Animal: 'Zebra'
  },
  {
    upperProb: 0.8,
    lowerProb: 0.25,
    Animal: 'Cat'
  },
  {
    upperProb: 0.25,
    lowerProb: 0,
    Animal: 'Narwhal'
  },
];

const generatedAnimal = {};

let animalChoice = () => {
  const numGen = Math.random();
  console.log(numGen);

  const selectedAnimal = animals.find(animal =>
    animal.upperProb > numGen
    && animal.lowerProb <= numGen
  );

  generatedAnimal.Animal = selectedAnimal.Animal;

  return generatedAnimal;

};

console.log(generatedAnimal);

const generateDist = () => {
  let animalDist = [];
  let i = 0;
  do {
    animalChoice();
    animalDist.push(generatedAnimal);
    console.log(generatedAnimal);
    i++
  } while (i < 10)
  console.log(animalDist);
}

generateDist();

【问题讨论】:

    标签: javascript arrays object


    【解决方案1】:

    您的代码几乎是正确的。您多次推送对数组的相同引用,从而获得 ref 2 输出。当它应该是一个变量时,您还使 generateAnimal 成为一个常量。易于修复,请参见下面的代码:

    const animals = [
      {
        upperProb: 1,
        lowerProb: 0.8,
        Animal: 'Zebra'
      },
      {
        upperProb: 0.8,
        lowerProb: 0.25,
        Animal: 'Cat'
      },
      {
        upperProb: 0.25,
        lowerProb: 0,
        Animal: 'Narwhal'
      },
    ];
    
    /*********change this**********************
    const generatedAnimal = {};
    **************to***************************/
    var generatedAnimal = {};
       
    let animalChoice = () => {
      const numGen = Math.random();
      //console.log(numGen);
       
    
    
      const selectedAnimal = animals.find(animal =>
        animal.upperProb > numGen
        && animal.lowerProb <= numGen
      );
    
      generatedAnimal.Animal = selectedAnimal.Animal;
    
      return generatedAnimal;
    
    };
    
    //console.log(generatedAnimal);
    
    const generateDist = () => {
      let animalDist = [];
      let i = 0;
      do {
    
      /**********add this************/
        generatedAnimal={};
      /******************************/
        animalChoice();
        animalDist.push(generatedAnimal);
        //console.log(generatedAnimal);
        i++
      } while (i < 10)
      console.log(animalDist);
    }
    
    generateDist();

    【讨论】:

    • 这很好用,感谢有关解决方案和有关变量更改的信息的帮助。我认为对象最好声明为常量,但现在回想起来,我可能只是在脑海中做出了这一点(对我来说并不完全不常见)。我确实有一个问题,为什么我们将 generateAnimal 设置为 generateDist 中的一个新对象?
    • 您将函数 animalChoice 定义为具有块范围的 let。 var generatedAnimal 在函数外部定义,因此具有全局范围。在调用 animalChoice 之前,您需要创建一个新对象。有更简洁的实现,但这对您的代码所做的更改最少。
    • 再看一下sn-p。我更新了它。我们首先将 generatedAnimal 定义为全局,然后在函数内部我们首先将其设置为 {}。这对我来说似乎更直观,但无论哪种方式都可以
    猜你喜欢
    • 2021-03-17
    • 1970-01-01
    • 2021-10-15
    • 2015-04-01
    • 1970-01-01
    • 2021-07-03
    • 2013-03-29
    • 2019-09-02
    • 2020-12-19
    相关资源
    最近更新 更多