深拷贝和差集

 

function deepClone(obj) {
  let newObj = Array.isArray(obj) ? [] : {}
  if (obj && typeof obj === "object") {
    for (let key in obj) {
      if (obj.hasOwnProperty(key)) {
        newObj[key] = (obj && typeof obj[key] === 'object' && obj[key] != null) ? deepClone(obj[key]) : obj[key];
      }
    }
  }
  return newObj
}

function deepClone2(obj,hash = new WeakMap()){//记录拷贝前后的对应关系
  if(obj == null) return obj;
  if(obj instanceof Date) return new Date(obj);
  if(obj instanceof RegExp) return new RegExp(obj);
  if(typeof obj !== 'object') return obj;
  if(hash.has(obj)) return hash.get(obj);//解决循环引用问题,返回上次拷贝的结果,不再递归了
  let cloneObj = new obj.constructor;//创建实例[]或{}
  hash.set(obj,cloneObj)
  for(let key in obj){
      if (obj.hasOwnProperty(key)) {
          cloneObj[key] = deepClone2(obj[key],hash);
      }
  }
  return cloneObj
}

 

 

功能较为完整

function deepClone(target,cache = new Map()){
  if(cache.get(target)){
      return cache.get(target)
  }
  if(target instanceof Object){
      let dist ;
      if(target instanceof Array){
        // 拷贝数组
        dist = [];
      }else if(target instanceof Function){
        // 拷贝函数
        dist = function () {
          return target.call(this, ...arguments);
        };
      }else if(target instanceof RegExp){
        // 拷贝正则表达式
       dist = new RegExp(target.source,target.flags);
      }else if(target instanceof Date){
          dist = new Date(target);
      }else{
        // 拷贝普通对象
        dist = {};
      }
      // 将属性和拷贝后的值作为一个map
      cache.set(target, dist);
      for(let key in target){
          // 过滤掉原型身上的属性
        if (target.hasOwnProperty(key)) {
            dist[key] = deepClone(target[key], cache);
        }
      }
      return dist;
  }else{
      return target;
  }
}

 

https://juejin.im/post/6889327058158092302

差集

var arr1 = [{id:1},{id:2}, {id:4}, {id:9}, {id:0}];
var arr2 = [2,0, 4];
var difference = function(arr1, arr2) {
       var diff = [];
       var tmp = arr2;
       $(arr1).each(function(i,val1){
             if (arr2.indexOf(val1.id) < 0) {
                   diff.push(val1);
             }
       });
       console.log(diff);
     }
difference(arr1, arr2);

 

posted @ 2020-10-30 17:56  石头记1  阅读(101)  评论(0)    收藏  举报