Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >尝试从JavaScript数组中删除JSON对象时收到错误消息

尝试从JavaScript数组中删除JSON对象时收到错误消息
EN

Stack Overflow用户
提问于 2019-07-18 22:24:00
回答 1查看 88关注 0票数 1

因此,我正在尝试构建一个相对简单的应用程序,它可以接收8个预先确定的名人,一次随机显示两个,并允许用户选择他们喜欢的,直到只剩下一个。我已经设法让JavaScript端的几乎所有东西都能正常工作,但偶尔我会收到一条可能会使应用程序崩溃的错误消息,而我不知道如何修复它。我真的很感谢社区能提供的任何帮助。

我已经检查了代码,寻找可能导致错误的逻辑问题,并尝试使用console.logs来识别它,但错误似乎阻止了console.logs本身在它发生时显示。

您可以在以下位置找到GitHub存储库:

https://github.com/jesberman/Celeb-Mash-Prototype

和活动站点(有错误)在这里:

https://jesberman.github.io/Celeb-Mash-Prototype/

代码的一个重要部分被组织为一系列if语句,我将在下面显示这些语句:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if(initialPicValue1 === initialPicValue2 && initialPicValue2 === celebArrayLength){
    initialPicValue2 -= 1;
}
if (initialPicValue1 === initialPicValue2){
    initialPicValue2 += 1;
}
if(initialPicValue1 === initialPicValue2 && initialPicValue1 === 0){
    initialPicValue2 += 1;
}
if (celebArrayLength === 1){
    return alert("Congrats! Your Favorite Celeb is " + celebArray[0].name);
}

我希望干净地遍历数组中的所有对象,没有任何问题,直到只剩下一个对象。但是,我有时会随机得到以下错误:

未捕获图片:无法在HTMLButtonElement.onclick (index.html:21)的pressButton1 (logic.js:128)读取未定义的属性“”picture“”

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-18 22:40:47

我可以看到你在这一行得到一个错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
console.log(celebArray[initialPicValue2].picture);

问题是您有一个名人数组,celebArray,当您单击其中一个按钮时,您正在访问该数组中的一个索引。当数组中只剩下一个名人时,就会发生错误,它试图访问一个不存在的索引。因此,为了避免该错误,您必须在if (celebArrayLength === 1)之前获取pressButton函数中的第一个代码块,并将其放入以下if语句中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if (celebArray.length > 1) {
  // do something
}

然后,当它运行if (celebArrayLength === 1)并发现只剩下一个名人时,您可以通过执行以下操作来隐藏按钮,因为现在游戏结束了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if (celebArrayLength === 1) {
  $('button').hide()
  return alert("Congrats! Your Favorite Celeb is " + celebArray[0].name);
}

在你的代码中,每个按钮都有一个函数,但我简化了它,所以现在有一个函数,对两个按钮都运行,你传入按钮的编号,比如<button id="button1" onclick="pressButton(1)">,然后你就有了一个像这样的function pressButton(e)函数。

因此,在该函数中,在变量e中有按钮的编号,您可以通过从数组[1,2]中删除e,然后使用剩余的编号来获得另一个按钮的编号:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var arr = [1,2] // a list with the numbers of the buttons
arr.splice(e-1, 1) // we remove the one that was pressed
var other = arr[0] // the one left is the other one

我整理了一些类似的东西。希望你能看到我做了什么。通常情况下,最好不要重复函数,这样当您想要更改某些内容时,只编辑一个函数会更容易,这样您就不必担心忘记对两个函数都进行编辑。

所以这是我的版本,解决了你的问题。我已经将图片链接到它们在网上的位置,但我保留了相关链接,但只是进行了评论。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var celebArray = [
    {
        name: "Tom Hanks",
        // picture: "assets/images/tomHanks.jpg"
        picture: "https://jesberman.github.io/Celeb-Mash-Prototype/assets/images/tomHanks.jpg"
    },
    {
        name: "Benedict Cumberbatch",
        // picture: "assets/images/benedictCumberbatch.jpg"
        picture: "https://jesberman.github.io/Celeb-Mash-Prototype/assets/images/benedictCumberbatch.jpg"
    },
    {
        name: "Charlize Theron",
        // picture: "assets/images/charlizeTheron.jpg"
        picture: "https://jesberman.github.io/Celeb-Mash-Prototype/assets/images/charlizeTheron.jpg"
    },
    {
        name: "Evangeline Lilly",
        // picture: "assets/images/evangelineLilly.jpg"
        picture: "https://jesberman.github.io/Celeb-Mash-Prototype/assets/images/evangelineLilly.jpg"
    },
    {
        name: "Katee Sackhoff",
        // picture: "assets/images/kateeSackhoff.jpg"
        picture: "https://jesberman.github.io/Celeb-Mash-Prototype/assets/images/kateeSackhoff.jpg"
    },
    {
        name: "Robert Downey Jr.",
        // picture: "assets/images/robertDowneyJr.jpg"
        picture: "https://jesberman.github.io/Celeb-Mash-Prototype/assets/images/robertDowneyJr.jpg"
    },
    {
        name: "Rose Leslie",
        // picture: "assets/images/roseLeslie.jpg"
        picture: "https://jesberman.github.io/Celeb-Mash-Prototype/assets/images/roseLeslie.jpg"
    },
    {
        name: "Denzel Washington",
        // picture: "assets/images/denzelWashington.jpg"
        picture: "https://jesberman.github.io/Celeb-Mash-Prototype/assets/images/denzelWashington.jpg"
    },
];

function picValues() {
  var initialPicValues = {}
  celebArrayLength = celebArray.length;
  initialPicValues[1] = Math.floor((Math.random() * celebArrayLength));
  var keys = Object.keys(celebArray)
  keys.splice(initialPicValues[1], 1)

  var rnd_2 = Math.floor((Math.random() * keys.length));
  initialPicValues[2] = keys[rnd_2]

  return initialPicValues
}

var celebArrayLength = celebArray.length;
var initialPicValues = picValues(celebArray)

function loadPics() {
  $("#picture1").css("background-image","url(" + celebArray[initialPicValues[1]].picture + ")");
  $("#picture2").css("background-image","url(" + celebArray[initialPicValues[2]].picture + ")");
}

loadPics();
console.log("Initial Array:");
console.log(celebArray);

function pressButton(e) {

  if (celebArrayLength > 1) {

    var arr = [1,2] // a list with the numbers of the buttons
    arr.splice(e-1, 1) // we remove the one that was pressed
    var other = arr[0] // the one left is the other one

    console.log("Initial Pic "+other+" Value");
    console.log(initialPicValues[other]);
    console.log("Celeb Being Removed");
    console.log(celebArray[initialPicValues[other]].picture);
    celebArray.splice(initialPicValues[other], 1);

    initialPicValues = picValues(celebArray)

  }

  if (celebArrayLength === 1) {
    $('button').hide()
    return alert("Congrats! Your Favorite Celeb is " + celebArray[0].name);
  }

  console.log("Celeb To Be Removed:")
  console.log(celebArray[initialPicValues[other]].picture);
  console.log('celebArrayLength', celebArrayLength)
  loadPics()

  console.log("Array After Button Press:");
  console.log(celebArray);

}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#main-div {
    padding-top: 50px;
    padding-right:10%; 
    padding-left: 10%; 
    background-color: gold; 
    width: 100%; 
    height: 700px;
}

#header-div {
    text-align: center; 
    background-color: green; 
    height: 100px; 
    width: 80%;
}

#left-div {
    display: inline-block; 
    background-color: red; 
    width: 40%; 
    height: 400px;
}

#picture1 {
    background-repeat: no-repeat; 
    width: 100%; 
    height: 300px;
}

#button1 {
    position: relative; 
    left: 40%;
}

#right-div {
    display: inline-block; 
    background-color: blue; 
    width: 40%; 
    height: 400px;
}

#picture2 {
    background-repeat: no-repeat; 
    width: 100%; 
    height: 300px;
}

#button2 {
    position: relative; 
    left: 40%;
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>

<head>
    <title>
        Celeb Mash
    </title>
    <link rel="stylesheet" href="assets/css/style.css">
    <script src="https://code.jquery.com/jquery.js"></script>
</head>

<body>
    <div id="main-div">
        <div id="header-div">
            <h2>
                Pick The Celeb You Like More
            </h2>
        </div>
        <div id="left-div">
            <div id="picture1">
            </div>
            <button id="button1" onclick="pressButton(1)">
                Submit
            </button>
        </div>
        <div id="right-div">
            <div id="picture2">
            </div>
            <button id="button2" onclick="pressButton(2)">
                Submit
            </button>
        </div>

    </div>
    <!-- <script src="assets/javascript/logic.js"> -->
    </script>
</body>

</html>

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57103327

复制
相关文章
如何从JavaScript对象中删除属性?
在使用 JavaScript 中的对象时,你可能会遇到需要从对象中完全删除属性的情况。为实现这一点可以有好几个选择:
疯狂的技术宅
2021/04/01
12.3K0
Confluence 6 尝试从 XML 备份中恢复时解决错误
错误可能是因为数据库突然不可访问而产生。也有可能是你备份文件有问题,你需要找到你 XML 备份文件中违反数据库规定的记录修改这个记录后再创建一个新的 XML 备份:
HoneyMoose
2019/01/31
9280
javascript中json对象json数组json字符串互转及取值
今天用到了json数组和json对象和json类型字符串之间互转及取值,记录一下:
kirin
2020/10/30
4.8K0
java json数组转json对象_json对象数组
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/09/30
10K0
java json数组转json对象_json对象数组
JavaScript Array(数组)对象中指定元素的删除
js在前台界面中举足轻重,在使用js删除数组时遇到一些问题(详见删除元素),参考很多大神的资料,现把常用的函数总结出来,以备不时之需。
全栈程序员站长
2022/09/15
2.9K0
php 数组转json对象 和json 数组
php中数组转json的规则是:当没有指定索引(0~n)时会转换为json数组,而指定了索引会转换为json对象。
全栈程序员站长
2022/06/24
6.4K0
JavaScript——数组对象
注意:当检测Array实例时, Array.isArray 优于 instanceof,因为Array.isArray能检测 iframes.
岳泽以
2022/10/26
1.5K0
JavaScript数组对象
万能操作 数组.splice(开始位置,数量,操作),操作后原数组的内容改变第一个参数是指定从几号位置开始删除或添加  第二个参数是指定删除几个元素
十月梦想
2018/08/29
1.7K0
JavaScript|数组对象
讲到数组会有人问,什么是数组?数组就是有序数据的集合,在JavaScript中的数组元素允许属于不同的数据类型,用数组名和下标就可以唯一地确定数组中的元素。接下来将会详细的讲解一下JavaScript数组对象。
算法与编程之美
2020/09/08
1.7K0
Python中使用deepdiff对比json对象时,对比时如何忽略数组中多个不同对象的相同字段
最近忙成狗了,很少挤出时间来学习,大部分时间都在加班测需求,今天在测一个需求的时候,需要对比数据同步后的数据是否正确,因此需要用到json对比差异,这里使用deepdiff。
小博测试成长之路
2023/09/21
9300
Python中使用deepdiff对比json对象时,对比时如何忽略数组中多个不同对象的相同字段
Python中如何快速解析JSON对象数组
由于浏览器可以迅速地解析JSON对象,它们有助于在客户端和服务器之间传输数据。本文将描述如何使用Python的JSON模块来传输和接收JSON数据。
Python学习者
2023/09/27
7730
Javascript中的数组对象排序(转载)
js中用方法sort()为数组排序。sort()方法有一个可选参数,是用来确定元素顺序的函数。如果这个参数被省略,那么数组中的元素将按照ASCII字符顺序进行排序。如:
李维亮
2021/07/08
8K0
如何删除 JavaScript 数组中的虚值[每日前端夜话0x55]
翻译:疯狂的技术宅 原文:https://medium.freecodecamp.org/how-to-remove-falsy-values-from-an-array-in-javascript-e623dbbd0ef2
疯狂的技术宅
2019/05/06
9.5K0
如何删除 JavaScript 数组中的虚值[每日前端夜话0x55]
JavaScript | 数组的splice()方法,向/从数组添加/删除项目,并返回删除的项目
JavaScript代码: /* * splice() 方法向/从数组添加/删除项目,并返回删除的项目。 * 注释:splice() 方法会改变原始数组。 * 语法:array.splice(index, howmany, item1, ....., itemX) * index:必需。整数,指定在什么位置添加/删除项目,使用负值指定从数组末尾开始的位置。 * howmany:可选。要删除的项目数。如果设置为 0,则不会删除任何项目。 * item1, ...
倾盖
2022/08/16
3.3K0
JavaScript | 数组的splice()方法,向/从数组添加/删除项目,并返回删除的项目
Java Jackson 中如何 Pending JSON 对象到数组中
这个是一个数组格式的 JSON 数据,如何使用 ArrayNode 来生成数据呢?
HoneyMoose
2022/01/06
4.8K0
Java Jackson 中如何 Pending JSON 对象到数组中
JavaScript 对象入门使用JSON
JavaScript对象表示法(JSON)是用于将结构化数据表示为JavaScript对象的标准格式,通常用于在网站上表示和传输数据
acc8226
2022/05/17
1.5K0
js中JSON对象字符串转数组
这个数组包含在JavaScript的帮助下从JSON字符串中获得的JavaScript对象的值。解决这一问题的方法有两种:
IT工作者
2021/12/29
8.6K0
[LEETCODE]从排序数组中删除重复项
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
用户2353021
2020/05/11
6.3K0
删除javascript数组中空元素
filter 请记住,此方法将返回一个新数组,其中的元素通过您提供给它的回调函数的条件。 例如,如果要删除null或未定义的值: var array = [0, 1, null, 2, "", 3, undefined, 3,,,,,, 4,, 4,, 5,, 6,,,,]; var filtered = array.filter(function (el) { return el != null; }); console.log(filtered); 可替代方法 function cleanArr
IT工作者
2022/01/21
1.5K0
JavaScript Array(数组) 对象
然而,如果你想从中找出某一辆车?并且不是3辆,而是300辆呢?这将不是一件容易的事!
陈不成i
2021/07/20
1.1K0

相似问题

尝试从JTable中删除行时收到大量错误消息

13

Javascript -从JSON数组中删除对象

10

尝试发送消息时收到错误

62

尝试从数组获取值以插入到MySQL时收到错误消息

20

从json数组javascript中删除整个对象

418
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文