【问题标题】:pulling a random item from multiple arrays从多个数组中拉出一个随机项
【发布时间】:2017-06-04 05:54:04
【问题描述】:

我有 12 个名为 f1f12 的数组,每个数组有五个项目。我想从每个数组中随机抽取一项并将其推入新数组sm1

var sm1 = [];

for (var i=1; i<=12; i++) {
    randomPrompt = Math.floor((Math.random() * 5));
    sm1.push("f"+i[randomPrompt]);
}

但是,这会返回一个随机索引 "f"+i,而不是索引 f1f2f3f4 等。

【问题讨论】:

  • 任何时候你发现自己创建了这样的数字变量,你应该改用数组。
  • 感谢您的提醒。是的,在这种情况下,f1 到 f12 变量名称特定于我正在使用的上下文和交叉引用课程内容。使用它们将使必须调整它的非编码人员知道要调整哪些位。

标签: javascript arrays random indexing


【解决方案1】:

为什么不使用二维数组而不是 12 个单个数组。然后就很容易了。

【讨论】:

    【解决方案2】:

    行下的变化

    sm1.push("f"+i[randomPrompt]);
    

    sm1.push(eval("f"+i+"["+randomPrompt+"]"));
    

    【讨论】:

      【解决方案3】:

      有几种方法可以完成您的要求。

      示例:

      var myArray = {
         "f1": [1,2,3,4,5],
         "f2": [6,7,8,9,10],
         "f3": [11,12,13,14,15],
         "f4": [16,17,18,19,20]
      }
      
      var sm1 = [];
      for (var i=1; i<=4; i++) {
          randomPrompt = Math.floor((Math.random() * 5));
          sm1.push(myArray["f"+i][randomPrompt]);
      }
      console.log(sm1);

      或者,如果您在浏览器中使用代码:

      f1 = [1,2,3,4,5];
      f2 = [6,7,8,9,10];
      f3 = [11,12,13,14,15];
      f4 = [16,17,18,19,20];
      
      var sm1 = [];
      
      for (var i=1; i<=4; i++) {
          randomPrompt = Math.floor((Math.random() * 5));
          sm1.push(window["f"+i][randomPrompt]);
      }
      console.log(sm1);

      或使用eval():

      f1 = [1,2,3,4,5];
      f2 = [6,7,8,9,10];
      f3 = [11,12,13,14,15];
      f4 = [16,17,18,19,20];
      
      var sm1 = [],item;
      
      for (var i=1; i<=4; i++) {
          randomPrompt = Math.floor((Math.random() * 5));
          item = eval(["f"+i][0]);
          sm1.push(item[randomPrompt]);
      }
      console.log(sm1);

      【讨论】:

      • 感谢阿里。非常全面。感谢您添加不同的版本,因为它可以帮助我了解其他方法。第二个工作正常,最接近我正在使用的代码。
      【解决方案4】:

      您可以使用窗口对象。

      var sm1 = [];
      
      for (var i=1; i<=12; i++) {
          randomPrompt = Math.floor((Math.random() * 5));
          sm1.push(window["f"+i][randomPrompt]);
      }
      

      【讨论】:

      • 你可以'this'或当前范围以防它不是全局的。
      • 我实际上在代码中的这一点上在全球范围内工作,所以这是合适的。尽管@Barmar,但我感谢您的警告。
      【解决方案5】:
      var sm1 = [f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12].map(function (arr) {
          return arr[Math.floor((Math.random() * arr.length))];   
      });
      

      不过,我会使用二维数组而不是命名为 12 个单个数组来投票。

      【讨论】:

        猜你喜欢
        • 2017-07-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-10
        • 2016-11-12
        • 2016-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多