javascript - 请教 关于数组数据筛选问题
伊谢尔伦
伊谢尔伦 2017-04-10 17:30:53
0
4
859

慕课网的编程练习题:
在一个大学的编程选修课班里,我们得到了一组参加该班级的*,分别是姓名、性别、年龄和年级,接下来呢,我们要利用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],这是什么原因呢?

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

Antworte allen(4)
Peter_Zhu

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

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

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

伊谢尔伦
newStudent[i]=infos[i];

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

newStudent.push(infos[i]);

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


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

加油。

迷茫

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

左手右手慢动作

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

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

多看看控制台。

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage