您的位置:首页 > Web前端 > JavaScript

js对象去重应用

2017-01-30 16:18 162 查看

域名转换

有这样一个需求,host文件如下所示:

127.0.0.1  localhost
127.0.0.1  dev.xx.com
10.2.3.4   test.xx.com
10.2.3.4   m.xx.com
10.1.1.1   jhs.m.xx.com
10.1.1.1   jhs.m.xx.com


需要整理成以下格式

127.0.0.1  localhost dev.xx.com
10.2.3.4   test.xx.com  m.xx.com
10.1.1.1   jhs.m.xx.com


原本一个域名对应一个ip的格式,现在改为一个ip对应一个域名数组。

首先我们需要读取文件,遍历文件每一行,然后对每一行的两边的空格使用trim()去除两边空格和换行,然后split以空格分隔IP和域名。接下来

//以host为key
var host_ip = { };
//以ip为key
var ip_host = { };
//先通过上文所取数据,host_ip使用域名为key, ip为value储存
for...
host_ip[HOST] = IP;
//如host_ip[m.xx.com] = 10.2.3.4


因为host文件中可能出现了重复记录的情况,所以我们考虑,使用host_ip对象去重(js对象key的唯一性)。最后通过for in得到我们想要的ip_host

for(key in host_ip){
var new_key = host_ip[key];
if(ip_host[new_key] instanceof Array){
ip_host[new_key].push(key);
} else {
ip_host[new_key] = [];
ip_host[new_key].push(key)
}
}


ip_host使用ip做为key, value为host数组,就得到了最开始的格式。

这里面有2个点要注意 :1.读取文件后要去除两边空格和换行符 ; 2.使用post_id对象作为中转和去重,key值唯一,可以在O(n)时间下达到去重的效果,而且查询只需要O(1),这样的对象存储接近于我们常说的hashmap

进度条

有这样一个需求:页面有10个text input,每次填了一个input的时候,进度条显示当前填写的百分比(假如填了两个input,进度条显示为20%,这时把其中一个input置空,进度条显示为10%)

正常思路我们会创建一个状态变量count,每次input修改的时候,就修改这个这个状态变量count,并且格式化成百分数,显示在页面上。

那么我们如果每次操作input(监听每次keyup事件),都更新这个count并且更新页面DOM节点,就会造成性能上的浪费(DOM节点的更新是最耗时的),那么我们可以在count之前使用一个对象countObj,这个对象key为input的name,通过这个对象避免重复修改count

//假设这里已经获得10个inputArr的DOM数组
var inputArr;
var countObj = {};
function computeCount(){
for(_key in countObj){
count++;
}
//update in view
//在视图中更行count
}
for(var i = 0, len = inputArr.length; i < len; i++){
inputArr[i].onkeyup = function(){
var name = this.name;
if(this.value){
//当input的value不为空的时候,检查countObj对象
if(!countObj[name]){
//如果countObj没有这个input的key
countObj[name] = 1;
computeCount();
}
//如果countObj已经这个input的key则忽略
} else {
if(countObj[name]){
delete(countObj[name]);
computeCount();
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  对象 javascript