在每个提交上显示一个新的随机数组类的随机数组子类

时间:2019-02-24 19:45:06

标签: javascript arrays random

我正在创建一个lorem ipsum应用,我想单击一个按钮以根据随机字符生成随机引号。而且字符之间的引号不会混用。但是,每次单击“提交”时,它只会显示我在数组中列出的第一个字符的随机引号。我该如何解决?

const aQuotes = require("./public/quotes/a");
const bQuotes = require("./public/quotes/b");
const cQuotes = require("./public/quotes/c");

const loremIpsum = new GenerateNewText();
function GenerateNewText(){}

GenerateNewText.prototype.getRandomSentence = function() {
  const charQuotes =
  [
    aQuotes,
    bQuotes,
    cQuotes,
  ]
  for(var i = 0; i < charQuotes.length; i++){
    let randomSentence = charQuotes[i][Math.floor(Math.random() * charQuotes[i][Math.floor(Math.random())].length)]
    return randomSentence;
  }
}

当我运行上面的示例时,它将显示随机存储在aQuotes中的引号列表,并在整个词中散布“ undefined”一词。如果我将bQuotes移动到数组的顶部,那么它将仅显示随机bQuotes,并且带有单词“ undefined”。为什么只显示数组中第一个元素的结果,为什么显示“未定义”(即aQuotes)?

const aQuotes = [
    "Lalalalalalalala.",
    "Blah blah blah blah.",
    "Blank Blank Blank Blank Blank." 
]

module.exports = aQuotes;

我尝试做charQuotes[i][Math.floor(Math.random())].length * charQuotes[i][Math.floor(Math.random())].length,以为它会首先将charQuotes数组随机化,然后再将单个a/b/cQuotes数组随机化,但最终返回一个数字169的块。其他“修复“我试图导致所有undefined文本的段落,所有NaN的段落,或在此处和此处插入所有带有单词“ undefined”的字符的所有引号。

如何每次单击都会随机化charQuotes数组和a/b/cQuotes数组中的内容?并摆脱出现的怪异“未定义”文本?

我正在使用Node and Express。

2 个答案:

答案 0 :(得分:0)

您可以.map() charQuotes并从每个输入数组返回伪随机值,然后进一步.sort()伪随机生成结果数组

const getRandomSentence = () => {
  const charQuotes =
  [
    ["a", "b", "c"],
    [1, 2, 3],
    [1.5, 2.5, 3.5],
  ];
  const r = charQuotes.map(arr => arr[Math.floor(Math.random() * arr.length)])
            .sort(_ => 0.5 - Math.random());
  return r.join(" ")
}

console.log(getRandomSentence());

答案 1 :(得分:0)

您不需要for循环。您进入循环仅是为了在第一次迭代中返回。这就是为什么您总是得到第一组引号的原因。

GenerateNewText.prototype.getRandomSentence = function() {
  const allQuotes =
  [
    aQuotes,
    bQuotes,
    cQuotes,
  ]
  const characterQuotes = allQuotes[ Math.floor(Math.random() * allQuotes.length) ]
  return characterQuotes[ Math.floor(Math.random() * characterQuotes.length) ]
}

如果要使用同一字符生成引号,则需要将字符信息保存在函数范围之外的变量中,或在对象实例中,如以下示例所示:

GenerateNewText.prototype.allQuotes = [
  aQuotes,
  bQuotes,
  cQuotes,
]
GenerateNewText.prototype.getRandomSentence = function() {
  if ( !this.characterQuotes ) {
    this.characterQuotes = this.allQuotes[ Math.floor(Math.random() * allQuotes.length) ]
  }
  return this.characterQuotes[ Math.floor(Math.random() * characterQuotes.length) ]
}