美文网首页
分享几个用于深复制的方法

分享几个用于深复制的方法

作者: 夏海峰 | 来源:发表于2021-05-22 15:42 被阅读0次

本篇摘要:主要分享了 JS 中常用的几种深复制方法,有来自于vuex``jQuery``JSON``lodash``immutable中的经典方法,如果有需要,你可以进一步去研究它们的源码。


1、使用 vuex源码中的deepCopy()方法

/**
   * Deep copy the given object considering circular structure.
   * This function caches all nested objects and its copies.
   * If it detects circular structure, use cached copy to avoid infinite loop.
   *
   * @param {*} obj
   * @param {Array<Object>} cache
   * @return {*}
   */
  function deepCopy (obj, cache) {
    if ( cache === void 0 ) cache = [];

    // just return if obj is immutable value
    if (obj === null || typeof obj !== 'object') {
      return obj
    }

    // if obj is hit, it is in circular structure
    var hit = find(cache, function (c) { return c.original === obj; });
    if (hit) {
      return hit.copy
    }

    var copy = Array.isArray(obj) ? [] : {};
    // put the copy into cache at first
    // because we want to refer it in recursive deepCopy
    cache.push({
      original: obj,
      copy: copy
    });

    Object.keys(obj).forEach(function (key) {
      copy[key] = deepCopy(obj[key], cache);
    });

    return copy
  }

2、JSON.parseJSON.stringify

var obj = { a: 1, b: 2 }
var copy = JSON.parse(JSON.stringify(obj))

3、jQuery 中 extend()

const copy = jQuery.extend([deep], target, object1, [objectN])

4、使用 lodash 工具库

import _ from 'lodash'
const b=_.cloneDeep(a)

5、使用 immutable 工具库

import { Map } from 'immutable'

const imA = Map({
    username:'马云',
    money:150000000000,
    info:{ married:true, witticism:'我没见过钱,我对钱不感兴趣' }
})
const imB = Map({
    username:'laoxie',
    gender:'男',
    info:{ married:false, age:18 }
})
const newImData = imA.merge(imB);
console.log(newImData.toJS());
//输出 :
// {
//     username:'laoxie',
//     gender:'男',
//     money:150000000000,
//     info:{ married:false, age:18 }
// }

const newImData = imA.mergeDeep(imB);
//输出 :
// {
//     username:'laoxie',
//     gender:'男',
//     money:150000000000,
//     info:{ married:false, age:18, witticism:'我没见过钱,我对钱不感兴趣' }
// }

6、自己封装深复制方法

function deepClone(target) {
  if (typeof (target) !== 'object') {
    return target;
  }
  var result;
  if (Object.prototype.toString.call(target) == '[object Array]') {
    // 数组
    result = []
  } else {
    // 对象
    result = {};
  }
  for (var prop in target) {
    if (target.hasOwnProperty(prop)) {
      result[prop] = deepClone(target[prop])
    }
  }
  return result;
}

本篇结束,感谢点赞!!!

相关文章

  • 分享几个用于深复制的方法

    本篇摘要:主要分享了 JS 中常用的几种深复制方法,有来自于vuex``jQuery``JSON``lodash`...

  • 2018-01-06 关于javascript的深拷贝浅拷贝 思

    目录: 什么是复制? 一个简单的浅复制 一个深复制的例子 普遍的深浅复制的几种实现方法 深拷贝,浅拷贝什么是复制?...

  • 十道前端面试题第【01】篇

    摘要:本篇分享了10道面试题,3个算法题、封装Ajax、封装防抖函数、封装节流函数,数组去重方法、封装深复制方法、...

  • 对象的复制

    只复制对象的指针称为浅复制;复制具有新的内存空间的对象则称为深复制。 NSObject中有copy方法,它能够通过...

  • JQuery克隆.clone()

    .clone()分为浅复制和深复制。 当直接调用.clone()方法时,为浅复制。只克隆节点,不会克隆节点的事件和...

  • JAVA基础2021/7/8

    1.Java.util.HashMap.putAll()是[HashMap]类的内置方法,用于复制操作。该方法将所...

  • 复制Assets 下文件到SD 卡

    方法1 方法2 方法一适用于小文件,少量文件的复制,但是大文件和批量文件复制会导致OOM,因为是一次性读取

  • 深拷贝和浅拷贝的异同以及实现方式

    相同点: 深拷贝和浅拷贝都是用于对复杂数据类型进行复制。 差异: 其区别在于深拷贝是对原数据进行递归复制,并存到一...

  • 浅拷贝、深拷贝的方法和区别

    浅拷贝:B复制了A,当修改A时,B跟着变。深拷贝:B复制了A,当修改A时,B没变化。 浅拷贝: 深拷贝:(方法二比...

  • Java的一些常用类以及函数

    Arrays.copyOf方法用于数组复制 使用java.util.Arrays类的copyOf方法可实现数组的复...

网友评论

      本文标题:分享几个用于深复制的方法

      本文链接:https://www.haomeiwen.com/subject/maanjltx.html