検索

ホームページ  >  に質問  >  本文

javascript - 请教 关于数组数据筛选问题

慕课网的编程练习题:
在一个大学的编程选修课班里,我们得到了一组参加该班级的*,分别是姓名、性别、年龄和年级,接下来呢,我们要利用JavaScript的知识挑出其中所有是大一的女生的的名字哦。
学生信息如下:

('小A','女',21,'大一'),  ('小B','男',23,'大三'),
('小C','男',24,'大四'),  ('小D','女',21,'大一'),
('小E','女',22,'大四'),  ('小F','男',21,'大一'),
('小G','女',22,'大二'),  ('小H','女',20,'大三'),
('小I','女',20,'大一'),  ('小J','男',20,'大三')

任务
第一步: 把这些数据组成一个数组,方便我们之后操作哦。
第二步: 筛选数据吧,首先找出都是大一的所有信息 ;
第三步: 最后再一次筛选上一步得到的数据,打印出都是女生的姓名 ;

——————————————————下面是我的答案————————————————

<script type="text/javascript">
 //第一步把之前的数据写成一个数组的形式,定义变量为 infos
 var infos = [
     ["小A","女",21,"大一"],
     ["小B","男",23,"大三"],
     ["小C","男",24,"大四"],
     ["小D","女",21,"大一"],
     ["小E","女",22,"大四"],
     ["小F","男",21,"大一"],
     ["小G","女",22,"大二"],
     ["小H","女",20,"大三"],
     ["小I","女",20,"大一"],
     ["小J","男",20,"大三"]
     ];
 
 //第一次筛选,找出都是大一的信息
 document.write("<p>使用for循环方法筛选出“大一”的数据:</p>");
 var newStudent = new Array();//定义一个新的数组变量存放筛选出来的数据后续处理
 for(var i=0; i<infos.length; i++)
 {
    if(infos[i][3]=="大一")
    {
        document.write(infos[i]+ "<br/>");   //正确
        newStudent[i]=infos[i];              //这里只存入了infos[0]
    }
 }
 document.write("<br />");
 for(var j=0; j<newStudent.length; j++)
 {
    if(newStudent[j][1]=="女")
    {
        document.write(newStudent[j][0]+ "<br/>");//小A
    }
 }
</script>

第三步的要求是可以用“&”同时判断两个条件,但是我想了另一方法去实现,就是把第二步筛选出来的数据存放到另一个变量“newStudent”里,再判断。

但是循环赋值只存入了infos[0],这是什么原因呢?

伊谢尔伦伊谢尔伦2791日前868

全員に返信(4)返信します

  • 天蓬老师

    天蓬老师2017-04-10 17:32:53

    你控制台打断点不难发现你的 newStudent 其实是一个稀疏数组(数组里的元素不是连续的)图片如下

    这样的话在 if(newStudent[j][1]=="女") 这句就会抱错,因为 newStudent[1] 为 undefined 再找 undefined[1] 一定会抱错,解决办法简单,直接把这句改成
    if(newStudent[j] && newStudent[j][1]=="女")
    当 newStudent[j] 为 undefined 时整个表达式为假直接跳过判断。

    第二种解决办法是在插入的时候就不产生稀疏数组
    newStudent.push(infos[i]);
    这样的话数组一定是连续的,但是上面的 && 还是建议加上,如果你中间的操做误删了 newStudent 中的元素产生稀疏数组,判断时还是会抱错

    返事
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-10 17:32:53

    newStudent[i]=infos[i];

    这一句是有问题的,
    简单的改法是:

    newStudent.push(infos[i]);

    吃了午饭回来给你讲一下Array


    吃个饭回来发现他们分析的很详细了,就免了长篇大论吧。
    主要的点在于你的新数组的赋值方式。
    你的写法会直接给某下标赋值会直接更改数组的长度,产生稀数,后面在遍历的时候,碰到undefined,又没容错做空判断啥的,所以就出问题了。
    本还想说数组的遍历方式等等的,比如直接es5的forEach、map等等会避免掉这个问题,但有点跑偏,对于新手来说一下子接收的数据量有点大。

    加油。

    返事
    0
  • 迷茫

    迷茫2017-04-10 17:32:53

    循环没问题,我运行你的代码报错了。。
    newStudent是一维数组,newStudent [j] [1] 你这调用有问题

    返事
    0
  • ringa_lee

    ringa_lee2017-04-10 17:32:53

    newStudent[i]=infos[i];这一句改成newStudent.push(infos[i]);。很简单,你只需要将符合条件的项加入到新数组就行,没必要通过 i 来对 newStudent 赋值。。

    你看到“循环赋值只存入了infos[0]”的结果。其实只是因为 newStudent[1] 压根就没赋值啊,没赋值就是 undefined,可是你又读取了newStudent[j][1],这时候就报错了。报错了后面的就执行不下去了,然后你就会觉得“循环赋值只存入了infos[0]”。都是假象啊。。。

    多看看控制台。

    返事
    0
  • キャンセル返事