前几天CVTE提前批笔试,看完题目感觉还行,前面的题在js高级程序设计教程部分有提到过,下面主要说一下后面的两道编程题:
其中第一道大概要求是统计一个html页面中各个标签出现的次数,本人自己的大概思路如下:
1,首先先获得程序中的所有标签的个数,得到之后做这么一个分析:
2(两层循环),类似于冒泡排序算法,这里假设我先抓取第一个元素,让我的第一个元素跟后面的元素进行比较,假如相同,那么把这个元素压入temp数组中,并在原来的队列里做减一操作,避免后续比较重复;
3.一直比较下去,直到最后,发现再无重复,就把原先的那个也压入temp数组,这里不压入会导致结果少1,就跟你点名一样,点人时不算上自己会少一个人;
4.最后把temp压入tag数组中,并做清零操作,进入下一个循环
废话不多说,上代码如下:
<script type="text/javascript">
var tags = document.getElementsByTagName('*'); //获取所有标签节点
var j=tag.length; //统计全部节点个数
console.log(j);
var tagsArr = []; //创建空数组缓冲区
function countTag(){
for (var i = 0; i < tags.length; i++) {
tagsArr.push((tags[i].tagName).toLowerCase()); //对标签节点做格式调整,全部转化为小写字母
}
// console.log(tagsArr);
//定义一个数组用于存放相同的元素
var temp = []; //临时数组用于统计在每次循环里相同标签的个数
var tag =[]; //定义一个空数组用于存放每一个标签,接收每次循环来自temp的值
for (var i = 0; i < tagsArr.length; i++) { //开始循环,思路与冒泡排序类似
for (var j = i+1; j < tagsArr.length+1; j++) {
if (tagsArr[i] == tagsArr[j]) { //取第一个,然后与后面的比较,看有多少重复
temp.push(tagsArr[j]);
tagsArr.splice(j,1); //如果重复,在 tagsArr中删掉该项,并把它压入temp中
j--; //删除后tagsArr发生变化,记得进行-1操作
}
if (j == tagsArr.length -i) { //当不断比较到达了数组的尾部时
temp.push(tagsArr[i]);
tagsArr.splice(i,1); //到底了,压入该比较项进temp,并在tagsArr中删除该标签
i--;
tag.push(temp);
temp = []; //temp的值交给tag后,置空,进入下一个循环,本次循环信息在tag中
}
}
}
return tag;
}
console.log(countTag());
</script>
第二道题是关于template.js模板引擎的问题的,要求是根据要求编出一个template引擎:
比如这样子,
var tpl = document.getElementById('tpl').innerHTML;
template(tpl, {list: [{name: "yan"},{name: "haijing"}]}); //json数组格式
输出格式:
<ul>
<li>yan</li>
<li>haijing</li>
</ul
那么根据题目中的意思,template引擎大概如下所示:
<script id="tpl" type="text/html">
<ul>
<%for(var i = 0; i < list.length; i++) {%>
<li><%:=list[i].name%></li>
<%}%>
</ul>
</script>
这里可以用一个type=”text/html”的script标签存放模板,或者放到字符串中