慕课网的编程练习题:
在一个大学的编程选修课班里,我们得到了一组参加该班级的*,分别是姓名、性别、年龄和年级,接下来呢,我们要利用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],这是什么原因呢?
天蓬老师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 中的元素产生稀疏数组,判断时还是会抱错
伊谢尔伦2017-04-10 17:32:53
newStudent[i]=infos[i];
这一句是有问题的,
简单的改法是:
newStudent.push(infos[i]);
吃了午饭回来给你讲一下Array
吃个饭回来发现他们分析的很详细了,就免了长篇大论吧。
主要的点在于你的新数组的赋值方式。
你的写法会直接给某下标赋值会直接更改数组的长度,产生稀数,后面在遍历的时候,碰到undefined,又没容错做空判断啥的,所以就出问题了。
本还想说数组的遍历方式等等的,比如直接es5的forEach、map等等会避免掉这个问题,但有点跑偏,对于新手来说一下子接收的数据量有点大。
加油。
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]”。都是假象啊。。。
多看看控制台。