任务目的
- 在上一任务基础上继续JavaScript的体验
- 学习JavaScript中的if判断语法,for循环语法
- 学习JavaScript中的数组对象
- 学习如何读取、处理数据,并动态创建、修改DOM中的内容
任务描述
- 参考以下示例代码,页面加载后,将提供的空气质量数据数组,按照某种逻辑(比如空气质量大于60)进行过滤筛选,最后将符合条件的数据按照一定的格式要求显示在网页上
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>IFE JavaScript Task 01</title>
</head>
<body>
<h3>污染城市列表</h3>
<ul id="aqi-list">
<!--
<li>第一名:福州(样例),10</li>
<li>第二名:福州(样例),10</li> -->
</ul>
<script type="text/javascript">
var aqiData = [
["北京", 90],
["上海", 50],
["福州", 10],
["广州", 50],
["成都", 90],
["西安", 100]
];
(function () {
/*
在注释下方编写代码
遍历读取aqiData中各个城市的数据
将空气质量指数大于60的城市显示到aqi-list的列表中
*/
})();
</script>
</body>
</html>
任务注意事项
- 实现简单功能的同时,请仔细学习JavaScript基本语法、事件、DOM相关的知识
- 请注意代码风格的整齐、优雅
- 代码中含有必要的注释
- 其中的数据以及60的判断逻辑可以自行设定
- 建议不使用任何第三方库、框架
- 示例代码仅为示例,可以直接使用,也可以完全自己重写
任务完成及总结:
实现思路:首先将符合条件的城市刷选出来,然后进行排序,最后将结果输出,下面请看相关案例。
案例一:
(function () {
//选出空气质量指数大于60的城市
var sortCount = aqiData.filter(function(item){
return (item[1] > 60);
});
//对大于60的城市进行从大到小排序
sortCount.sort(function(a, b){
return b[1] - a[1];
});
var aqiList = document.getElementById('aqi-list');
//将结果显示
for(var i = 0; i < sortCount.length; i++){
aqiList.innerHTML += '<li>第' + (i + 1) + '名:' + sortCount[i][0] + '(样例) , ' + sortCount[i][1] + '</li>';
}
})();
利用filter函数将符合相关条件的城市选出来,同时把所有刷选出的数据存储在新数组中。更多详情请戳JS中filter()方法。接着根据新数组的第二个数值进行从大到小的排序,更多sort()知识请戳JS中sort()方法。其中还能继续优化,把innerHTML替换为createTextNode(),如:
for(var i = 0; i < sortCount.length; i++){
//aqiList.innerHTML += '<li>第' + (i + 1) + '名:' + sortCount[i][0] + '(样例) , ' + sortCount[i][1] + '</li>';
var li = document.createElement("li");
li.appendChild(document.createTextNode("第"+(i+1)+"名:"+sortCount[i][0]+","+sortCount[i][1]));
aqiList.appendChild(li);
}
案例二:
(function () {
var oList = document.getElementById("aqi-list");
var arr = ["一","二","三","四","五"];
//sort 从大到小
aqiData.sort(function(a,b){
return b[1]-a[1];
});
oList.innerHTML = "";
for(var i=0;i<aqiData.length;i++){
if(aqiData[i][1]>60){
//创建一个节点 var oLi = document.createElement("li");
oLi.innerHTML = '第'+arr[i]+'名:'+aqiData[i][0]+','+aqiData[i][1];
//向节点oList添加子节点oLi oList.appendChild(oLi);
}
}
})();
思路大同小异,只是在运算速度上要比案例一要慢,原因是含有双重循环,并且环内appendChild重排会引起性能下降。更多详情请戳JS中appendChild()方法。
案例三:
(function () {
var chineseNumbers = ["一","二","三","四","五","六","七","八","九","十"];
var contentStr = "";
aqiData.filter(function(element){return element[1] > 60;})
.sort(function (d1,d2){ return d2[1] - d1[1]; })
.forEach(function (element,index){
contentStr += "<li>第" + chineseNumbers[index] + "名:" + element[0] + "," + element[1] + "</li>";
});
document.getElementById("aqi-list").innerHTML = contentStr;
})();
该案例别样的使用了链式调用,以及使用了ES5新增的array.forEach方法来代替for循环遍历处理数组元素,并使用了element.innerHTML属性一次性改变元素的DOM结构