我正在尝试构建一个随机名称生成器应用程序,并且在完成有关如何获取“名字”和“姓氏”的随机组合的工作的同时,我面临的问题是每个列表项会显示完全相同的名称,尽管名称本身 是随机的。请参见下面的代码:
let nameList = document.getElementById("name-list"); // <ul> in HTML doc
let names = document.getElementsByClassName("name"); // <li> in HTML doc, 10 in total
function Generate() { // onclick function
nameList.style.display = 'block';
randomFirstM = nameObj["male"]["first"][Math.floor(Math.random() *
Object.keys(nameObj["male"]["first"]).length)] //nameObj is from a different JS file which contains sub-Objects for male/female and first/last names
randomLastM = nameObj["male"]["last"][Math.floor(Math.random() *
Object.keys(nameObj["male"]["last"]).length )]
for(let i = 0; i < names.length; i++) {
names[i].innerHTML = randomFirstM + " " + randomLastM;
}
}
因此它将显示如下内容:
代替:
任何评论和建议都将不胜感激。
答案 0 :(得分:2)
您需要在循环的每次迭代中生成一个随机的名字和姓氏 –目前,您只需要在开始时选择一个随机名称,然后再使用该名称每次都命名。也许做一个接受数组并返回一个函数的函数,该函数从数组中选择一个随机元素作为DRY代码。
还要注意,在可能使用点表示法的情况下,点表示法比括号表示法更可取,并且除非您有意插入HTML标记,否则最好将分配给.textContent
比分配给.innerHTML
(这更安全,更快,更可靠):
const makeRandom = arr => {
const { length } = arr;
return () => arr[Math.floor(Math.random() * length)];
};
const randomFirstM = makeRandom(nameObj.male.first);
const randomLastM = makeRandom(nameObj.male.last);
for(let i = 0; i < names.length; i++) {
names[i].textContent = randomFirstM() + " " + randomLastM();
}