js对象去重应用

域名转换

有这样一个需求,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();
              }
           } 
       }
   }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值