sf-utils2 sf-utils2
版本v3.3.3-beta1
首页
  • 01.快速开始 🔥
  • 02.基础-Base
  • 03.对象-Object
  • 04.数组-Array
  • 05.方法-Function
  • 06.字符串-String
  • 07.数学-Math
  • 08.dom
  • 09.拓展
  • webpack5.x教程学习 (opens new window)
  • 例子
  • 教程 🔥
  • 例子配置
企业级后台模版 (opens new window)
版本v3.3.3-beta1
首页
  • 01.快速开始 🔥
  • 02.基础-Base
  • 03.对象-Object
  • 04.数组-Array
  • 05.方法-Function
  • 06.字符串-String
  • 07.数学-Math
  • 08.dom
  • 09.拓展
  • webpack5.x教程学习 (opens new window)
  • 例子
  • 教程 🔥
  • 例子配置
企业级后台模版 (opens new window)
  • 快速开始

  • 基础-Base

  • 对象-Object

    • 序言 👏
    • has【对象含有属性(功能更强大)】
    • hasOwn【对象含有属性(扩展)】
    • deepClone【深度克隆】
      • 1.示例
      • 2.入参说明
      • 3.源码
    • setPropPath【给每个对象设置路径节点名】
    • findPropPath【从对象中找到键名路径名】
    • get【获取对象属性值】🔥🔥🔥
    • flatten 【将对象进行扁平化】
    • readonly【定义只读属性】
    • def【定义不可枚举属性】
    • cache【内存缓存对象】
    • bus【发布订阅】🔥🔥🔥
    • merge 【合并对象】
    • deepMerge 【递归深合并对象】
    • transformObjectKeys【对象属性字段全部转成大写或者小写】
    • convertPropToLower【对象属性字段全部转成大写或者小写】
    • looseEqual【比较对象内部结构和数据】🔥🔥🔥
    • omit【忽略对象属性】
    • pick【取出对象属性】
  • 数组-Array✨✨✨

  • 方法-Function

  • 字符串-String

  • 数学-Math

  • 文件-Buffer

  • 节点-dom

  • 拓展

  • nodejs

目录

deepClone【深度克隆】

描述

深度克隆。 可以使用,你也可以去使用 lodash-es 中的 clone 方法 (opens new window)

# 1.示例

import { deepClone } from 'sf-utils2'

const user = {
  name: '蔡徐坤',
  id: '1',
  list: [],
  obj: {
    id: '---',
    hos: {
      location: {
        name: '卫生院'
      }
    },
    say() {
      console.log(this)
    }
  }
}
console.log('开始')
const userCopy = deepClone(user)
console.log(userCopy)
console.log(userCopy.list === user.list) // false

// 结果:
// {
//   name: '张洪文',
//     id: '1',
//     list: [],
//     obj: {
//       id: '---',
//       hos: {
//         location: {
//         name: '卫生院'
//       }
//     }
//   }
// }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

:::

# 2.入参说明

参数 说明 类型 是否必填 默认值
target 原数据 Any 是

# 3.源码

import _typeof from '@/base/_typeof'

/**
 * 浅拷贝/深拷贝
 * @param {Object} obj 对象/数组
 * @param {Boolean} isDeep 是否深度拷贝 默认是
 * @return {Object}
 */
function deepClone(obj, isDeep = true) {
  function getNativeCtor(val, args) {
    const Ctor = val.__proto__.constructor
    return args ? new Ctor(args) : new Ctor()
  }

  function handleValueClone(item, isDeep) {
    return isDeep ? copyValue(item, isDeep) : item
  }

  function copyValue(val, isDeep) {
    if (val) {
      switch (_typeof(val)) {
        case 'Object': {
          const restObj = Object.create(val.__proto__)
          Object.keys(val).forEach(key => {
            restObj[key] = handleValueClone(val[key], isDeep)
          })
          return restObj
        }
        case 'Date':
        case 'RegExp': {
          return getNativeCtor(val, val.valueOf())
        }
        case 'Array':
        case 'Arguments': {
          const restArr = []
          val.map(item => {
            restArr.push(handleValueClone(item, isDeep))
          })
          return restArr
        }
        case 'Set': {
          const restSet = getNativeCtor(val)
          restSet.forEach(item => {
            restSet.add(handleValueClone(item, isDeep))
          })
          return restSet
        }
        case 'Map': {
          const restMap = getNativeCtor(val)
          restMap.forEach(item => {
            restMap.set(handleValueClone(item, isDeep))
          })
          return restMap
        }
      }
    }
    return val
  }
  return copyValue(obj, isDeep)
}

export default deepClone
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
上次更新: 2023/06/24, 19:35:48
hasOwn【对象含有属性(扩展)】
setPropPath【给每个对象设置路径节点名】

← hasOwn【对象含有属性(扩展)】 setPropPath【给每个对象设置路径节点名】→

Theme by Vdoing | Copyright © 2022-2025 bianpengfei
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×