javascript - 如何填充带有随机对象元素?
问题描述
我正在尝试构建一个随机名称生成器应用程序,虽然我已经完成了如何获得“名”和“姓”的随机组合的工作,但我面临的问题是每个列表项都显示了确切的相同的名称,尽管名称本身是随机的。请看下面的代码:
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;
}
}
所以它会显示如下内容:
- 约翰史蒂文森
- 约翰史蒂文森
- 约翰史蒂文森
- 约翰史蒂文森
- 约翰史蒂文森
代替:
- 约翰史蒂文森
- 理查德·约翰逊
- 乔治·亨利
- 迈克尔·泰勒
- 亚伦史蒂文斯
非常感谢任何意见和建议。
解决方案
您需要在循环的每次迭代中生成一个随机的名字和姓氏- 目前,您只是在开始时选择一个随机名称,然后每次都使用相同的名称。也许制作一个函数,该函数接受一个数组并返回一个函数,该函数从数组中选择一个随机元素用于 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();
}
推荐阅读
- visual-c++ - 如何在 Visual std C++ 上编写一些公式(在“类”类型中)
- amazon-web-services - Fargate 的公共 IP 上的 HTTPS - 可能吗?
- javascript - 如何在javascript中使用图像的src更改标识符的url?
- java - 在 RecyclerView 中单击项目的问题
- javascript - 脚本将“=s1400”附加到图像 src 路径,现在图像不会加载
- java - 放心:获取 org.apache.http.ConnectionClosedException:内容长度分隔的消息正文过早结束
- laravel - 如何在 ubuntu 上设置虚拟主机
- javascript - 如何在不向主容器添加滚动的情况下将滚动设置为兄弟孩子
- spring-boot - spring boot 项目作为另一个 spring-boot 项目中的依赖项
- php - Linux命令不能从PHP网站工作,但可以从终端工作