我正在创建一个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。
答案 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) ]
}