clone.js 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import { isArray, isNull, isPlainObject } from './check-types'
  2. const primitiveTypes = ['undefined', 'string', 'number', 'boolean']
  3. /**
  4. * 拷贝数据
  5. * @param {*} data 要拷贝的源数据
  6. * @param {Boolean} isDeep 是否深拷贝,默认浅拷贝
  7. * @return {*} 返回拷贝后的数据
  8. */
  9. export default (data, isDeep) => {
  10. if (isNull(data)) {
  11. return data
  12. }
  13. let t = typeof data
  14. if (t === 'function' || primitiveTypes.indexOf(t) >= 0) {
  15. return data
  16. }
  17. if (isArray(data)) {
  18. return cloneArr(data, isDeep)
  19. }
  20. return cloneObj(data, isDeep)
  21. }
  22. const cloneObj = (obj, isDeep) => {
  23. if (!isDeep) {
  24. return Object.assign({}, obj)
  25. }
  26. let ret = {}
  27. let keys = Object.keys(obj)
  28. keys.forEach((k) => {
  29. let d = obj[k]
  30. if (isNull(d)) {
  31. ret[k] = d
  32. return true
  33. }
  34. let t = typeof d
  35. if (t === 'function' || primitiveTypes.indexOf(t) >= 0) {
  36. ret[k] = d
  37. return true
  38. }
  39. ret[k] = isPlainObject(d) ? cloneObj(d, true) : cloneArr(d, true)
  40. })
  41. return ret
  42. }
  43. const cloneArr = (arr, isDeep) => {
  44. if (!isDeep) {
  45. return arr.concat()
  46. }
  47. let ret = []
  48. arr.forEach((d, i) => {
  49. if (isNull(d)) {
  50. ret[i] = d
  51. return true
  52. }
  53. let t = typeof d
  54. if (t === 'function' || primitiveTypes.indexOf(t) >= 0) {
  55. ret[i] = d
  56. return true
  57. }
  58. ret[i] = isArray(d) ? cloneArr(d, true) : cloneObj(d, true)
  59. })
  60. return ret
  61. }