请老师帮忙检查一下代码

来源:4-3 编程练习

Niklause

2021-07-19 09:26:46

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>数组</title>

</head>

<body>

    <script>


        var arr=["有效","无效","有效","无效","无效","有效"];


        // 补充代码

        for(var i=0;i<arr.length;i++){

            if(arr[i]=="无效"){

                arr.splice(i,1);

                arr[i]=arr[i-1];

            }

        }

        document.write(arr);

    </script>

</body>

</html>


问题描述:

老师,为什么会有四个有效,一直不太明白。请老师解答一下。

尝试过的解决方式:

在if外面加一句arr.pop(),结果又变成两个有效。

写回答

1回答

好帮手慕久久

2021-07-19

同学你好,代码不对。可以通过分析代码运行过程,得到为什么打印4个“有效”:

i=0时,arr[0]是“有效”,不执行if中的代码,然后i++;

i=1时,arr[1]是无效,执行if中的代码。arr.splice(1,1)表示删除索引是1的元素,此时arr变成["有效","有效","无效","无效","有效"](删除操作会改变arr):

http://img.mukewang.com/climg/60f4e4040924d1e508240137.jpg

而arr[i]=arr[i-1]就是arr[1]=arr[0],该句代码的意思是将索引是1的元素改成索引时0的元素:

http://img.mukewang.com/climg/60f4e53409add73306990242.jpg

由于arr[1]和arr[0]的值一样,所以if语句执行完后,arr还是["有效","有效","无效","无效","有效"]。

i=2时,["有效","有效","无效","无效","有效"]的索引2位置,是“无效”,满足if条件,索引2元素会被删除,arr变成

["有效","有效","无效","有效"]:

http://img.mukewang.com/climg/60f4e5c80990062b05170127.jpg

再执行 arr[2]=arr[1],会把["有效","有效","无效","有效"]中的索引2元素,换成索引1元素:

http://img.mukewang.com/climg/60f4e6250908398406180241.jpg

所以最后有4个有效。

而使用pop的结果,同学也可以像上面一样,通过逐步分析获取原因。

本练习实现,可参考如下:

http://img.mukewang.com/climg/60f4e7fd09b0b3ca07750326.jpg

其中,之所以要修正i是因为arr删除元素后,元素会重排,删除元素后面的元素会前移一位,索引会减1。以i=1为例,由于arr[1]会被删除,所以1后面的元素索引会由2变成1:

http://img.mukewang.com/climg/60f4e89d09a109b307760194.jpg

如果不修正i,i++后会变成2,会漏掉一个元素:

http://img.mukewang.com/climg/60f4e927098da4d308960237.jpg

祝学习愉快!

0

0 学习 · 17877 问题

查看课程