javascript - 数组到达迭代结束时无法读取未定义的属性“用户名”
问题描述
我正在尝试制作一个动态的推荐评论页面,在您单击箭头后显示新评论。
我不明白为什么单击数组后,它会推送“未捕获的类型错误:无法读取未定义的属性'userName'”的错误
我尝试过使用 users.length - 1,但这仍然不起作用。
谢谢
const users = [
{
userAvatar: "./avatar1.png",
userName: "Rego",
userStars: "*****",
userReviews: "Awesome company!",
},
{
userAvatar: "./avatar2.png",
userName: "Jim",
userStars: "***",
userReviews: `10/10 Loved it !`,
},
{
userAvatar: "./avatar1.png",
userName: "Jerry",
userStars: "****",
userReviews: `Would recommend to my friends`,
},
{
userAvatar: "./avatar3.png",
userName: "Jane",
userStars: "*****",
userReviews: `Definitely coming back`,
},
];
console.log(users[0]);
const name = document.querySelector(".name");
const avatar = document.querySelector(".avatar");
const stars = document.querySelector(".stars");
const reviews = document.querySelector(".review");
const left = document.querySelector(".left");
const right = document.querySelector(".right");
let i = 1;
// Check Users
function checkUsers() {
if (i < users.length) {
i++;
console.log(i);
changeUsers(users);
} else if (i === users.length) {
i = 0;
console.log(i);
}
}
function changeUsers(arr) {
name.innerText = arr[i].userName;
avatar.setAttribute("src", arr[i].userAvatar);
stars.innerText = arr[i].userStars;
reviews.innerText = arr[i].userReviews;
}
right.addEventListener("click", checkUsers);
body {
background: linear-gradient(rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.8)),
url("./cars.jpg") center;
min-height: 100vh;
}
#reviews {
display: flex;
height: 100%;
align-content: center;
justify-content: center;
}
#title {
color: white;
font-size: 3.5rem;
text-align: center;
margin: 3rem 0;
padding: 0px;
}
.testimonials {
border: 2px solid white;
color: white;
text-align: center;
width: 50%;
align-self: center;
min-height: 50vh;
border-radius: 5px;
letter-spacing: 5px;
position: relative;
}
.testimonials .avatar {
height: 8rem;
border: white solid 5px;
border-radius: 50%;
padding: 2rem;
z-index: 2;
margin: 1rem 0;
}
.testimonial {
display: flex;
flex-direction: column;
justify-content: center;
}
.testimonial h2 {
font-size: 3rem;
margin: 0px;
padding: 0px;
}
.testimonial h3 {
font-size: 2.5rem;
padding: 5px 0;
}
.testimonial p {
font-size: 1.5rem;
text-align: center;
padding: 0 2rem;
word-wrap: break-word;
white-space: pre-wrap;
width: 80%;
margin: 1rem auto;
}
.left {
position: absolute;
left: -150px;
top: 50%;
transform: translateY(-50%);
}
.right {
position: absolute;
right: -150px;
top: 50%;
transform: translateY(-50%);
transform: rotate(180deg);
}
.left,
.right {
cursor: pointer;
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<link rel="stylesheet" href="./style.css" />
<script src="script.js" defer></script>
</head>
<body>
<h1 id="title">Customer Reviews</h1>
<section id="reviews">
<div class="testimonials">
<img class="left" src="./arrow.png" alt="Left arrow" />
<img class="right" src="./arrow.png" alt="right arrow" />
<img class="avatar" src="./avatar1.png" alt="Avatar" />
<div class="testimonial">
<h2 class="name">Sandy</h2>
<h3 class="stars">*****</h3>
<p class="review">
Lorem ipsum dolor sit amet consectetur adipisicing elit. Accusamus
dolor repudiandae iusto modi, consequatur temporibus a iste
voluptatum soluta ipsum.
</p>
</div>
</div>
</section>
</body>
</html>
解决方案
您正在检查索引是否小于长度,然后添加一个
var users = [1,2,3];
let i = 2;
if (i < users.length) {
i++;
console.log(users[i]);
}
如您所见,您越过了最后一个索引。所以你想在检查之前增加。
var users = [1, 2, 3];
let i = 2;
i++;
if (i < users.length) {
console.log(users[i]);
} else {
console.log('here');
}
推荐阅读
- java - 使用java将文件从s3存储桶子文件夹复制到另一个子文件夹时面临重复文件创建问题?
- html - 引导容器内的一列,另一列延伸到屏幕边缘
- libraries - 我在哪里可以找到 FreePascal 的 LibTypes 和 LibGIS 单元?
- jquery - 提交表单后,我的事件监听器不会触发
- javascript - 在提交之前使用 JavaScript 更改 HTML 表单值
- javascript - 如何在 Vanilla Js 中通过 replace() 使用动态数据更改重复项
- java - 为什么Java中的replaceAll()方法认为字符串“:n”与“.n”相同?
- mysql - Excel公式无需编码即可将范围内的多个元素插入到sql列中?
- c# - .net WebSocketClient 的 ConnectAsync 类抛出错误“无法访问已处置的对象 ClientWebSocket”。
- excel - 查找两个 Excel 工作表之间的共享数据