JavaScript基础(3) -- JavaScript实现Map对象

  1. function HashMap()     

  2.  {     

  3.      /** Map 大小 **/    

  4.      var size = 0;     

  5.      /** 对象 **/    

  6.      var entry = new Object();     

  7.           

  8.      /** 存 **/    

  9.      this.put = function (key , value)     

  10.      {     

  11.          if(!this.containsKey(key))     

  12.          {     

  13.              size ++ ;     

  14.          }     

  15.          entry[key] = value;     

  16.      }     

  17.           

  18.      /** 取 **/    

  19.      this.get = function (key)     

  20.      {     

  21.          return this.containsKey(key) ? entry[key] : null;     

  22.      }     

  23.           

  24.      /** 删除 **/    

  25.      this.remove = function ( key )     

  26.      {     

  27.          if( this.containsKey(key) && ( delete entry[key] ) )     

  28.          {     

  29.              size --;     

  30.          }     

  31.      }     

  32.           

  33.      /** 是否包含 Key **/    

  34.      this.containsKey = function ( key )     

  35.      {     

  36.          return (key in entry);     

  37.      }     

  38.           

  39.      /** 是否包含 Value **/    

  40.      this.containsValue = function ( value )     

  41.      {     

  42.          for(var prop in entry)     

  43.          {     

  44.              if(entry[prop] == value)     

  45.              {     

  46.                  return true;     

  47.              }     

  48.          }     

  49.          return false;     

  50.      }     

  51.           

  52.      /** 所有 Value **/    

  53.      this.values = function ()     

  54.      {     

  55.          var values = new Array();     

  56.          for(var prop in entry)     

  57.          {     

  58.              values.push(entry[prop]);     

  59.          }     

  60.          return values;     

  61.      }     

  62.           

  63.      /** 所有 Key **/    

  64.      this.keys = function ()     

  65.      {     

  66.          var keys = new Array();     

  67.          for(var prop in entry)     

  68.          {     

  69.              keys.push(prop);     

  70.          }     

  71.          return keys;     

  72.      }     

  73.           

  74.      /** Map Size **/    

  75.      this.size = function ()     

  76.      {     

  77.          return size;     

  78.      }     

  79.           

  80.      /* 清空 */    

  81.      this.clear = function ()     

  82.      {     

  83.          size = 0;     

  84.          entry = new Object();     

  85.      }     

  86.  }     

  87.       

  88.  var map = new HashMap();     

  89.       

  90.  /*   

  91.  map.put("A","1");   

  92.  map.put("B","2");   

  93.  map.put("A","5");   

  94.  map.put("C","3");   

  95.  map.put("A","4");   

  96.  */    

  97.  /*   

  98.  alert(map.containsKey("XX"));   

  99.  alert(map.size());   

  100.  alert(map.get("A"));   

  101.  alert(map.get("XX"));   

  102.  map.remove("A");   

  103.  alert(map.size());   

  104.  alert(map.get("A"));   

  105.  */    

  106.       

  107.  /** 同时也可以把对象作为 Key **/    

  108.  /*   

  109.  var arrayKey = new Array("1","2","3","4");   

  110.  var arrayValue = new Array("A","B","C","D");   

  111.  map.put(arrayKey,arrayValue);   

  112.  var value = map.get(arrayKey);   

  113.  for(var i = 0 ; i < value.length ; i++)   

  114.  {   

  115.      //alert(value[i]);   

  116.  }   

  117.  */    

  118.  /** 把对象做为Key时 ,自动调用了该对象的 toString() 方法 其实最终还是以String对象为Key**/    

  119.       

  120.  /** 如果是自定义对象 那自己得重写 toString() 方法 否则 . 就是下面的结果 **/    

  121.       

  122.  function MyObject(name)     

  123.  {     

  124.      this.name = name;     

  125.  }     

  126.       

  127.  /**   

  128.  function MyObject(name)   

  129.  {   

  130.      this.name = name;   

  131.         

  132.      this.toString = function ()   

  133.      {   

  134.          return this.name;   

  135.      }   

  136.  }   

  137.  **/    

  138.  var object1 = new MyObject("小张");     

  139.  var object2 = new MyObject("小名");     

  140.       

  141.  map.put(object1,"小张");     

  142.  map.put(object2,"小名");     

  143.  alert(map.get(object1));     

  144.  alert(map.get(object2));     

  145.  map.remove("xxxxx");     

  146.  alert(map.size());     

  147.       

  148.  /** 运行结果 小名 小名 size = 1 **/    

  149.       

  150.  /** 如果改成复写toString()方法的对象 , 效果就完全不一样了 **/    

  151.       

  152.  </script>    

转载于:https://www.cnblogs.com/zxingp/articles/6146281.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
k-means算法是一种常见的聚类算法,可以将数据集合分成k个类别。在javascript中,可以使用以下步骤实现k-means算法: 1. 随机选择k个点作为初始的类别中心。 2. 针对每个数据点,计算其与每个类别中心的距离,并将其分配到距离最近的类别中心所代表的类别中。 3. 针对每个类别,重新计算其类别中心。 4. 重复步骤2和3,直到类别中心不再发生变化或达到预设次数。 以下是实现k-means算法的完整javascript代码,假设有一个名为"data"的数组代表需要聚类的数据集合,k为设定的类别个数: ```javascript //随机选择k个点作为初始的类别中心 function kMeans(data, k){ var centroids = [] for(var i=0; i<k; i++){ centroids.push(data[Math.floor(Math.random()*data.length)]) } var iterations = 0 var oldCentroids //重复执行聚类过程,直到类别中心不再发生变化或达到预设次数 do{ oldCentroids = centroids.slice() var clusters = new Array(k).fill(0).map(() => []) //将每个数据点分配到距离最近的类别中心所代表的类别 for(var i=0; i<data.length; i++){ var distances = [] for(var j=0; j<k; j++){ var distance = calculateDistance(data[i],centroids[j]) distances.push(distance) } var minIndex = distances.indexOf(Math.min(...distances)) clusters[minIndex].push(data[i]) } //重新计算每个类别的中心 for(var i=0; i<k; i++){ centroids[i] = calculateCentroid(clusters[i]) } iterations++ } while(iterations<100 && !centroidsEqual(centroids, oldCentroids)) //返回聚类结果 return clusters } //计算两个点之间的欧几里德距离 function calculateDistance(p1, p2){ var sum = 0 for(var i=0; i<p1.length; i++){ sum += Math.pow(p1[i]-p2[i], 2) } return Math.sqrt(sum) } //计算指定类别的中心点 function calculateCentroid(cluster){ var centroid = [] var numDimensions = cluster[0].length for(var i=0; i<numDimensions; i++){ var sum = 0 for(var j=0; j<cluster.length; j++){ sum += cluster[j][i] } centroid.push(sum/cluster.length) } return centroid } //判断两个类别中心是否相等 function centroidsEqual(c1, c2){ var tolerance = 0.0001 for(var i=0; i<c1.length; i++){ for(var j=0; j<c1[i].length; j++){ if(Math.abs(c1[i][j]-c2[i][j]) > tolerance){ return false } } } return true } ``` 这是一个标准的k-means算法实现,但由于javascript运行在浏览器中,性能可能会受到限制。如果需要对大型数据集合进行聚类,可以考虑使用其他高性能语言实现聚类算法,如python、R、C++等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值