utils.js 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. /**
  2. * Created by majw on 2017/4/12.
  3. */
  4. // var md5Lib = require('blueimp-md5')
  5. //对象深拷贝
  6. function deepClone(data){
  7. var obj = {};
  8. var originQueue = [data];
  9. var copyQueue = [obj];
  10. //以下两个队列用来保存复制过程中访问过的对象,以此来避免对象环的问题(对象的某个属性值是对象本身)
  11. var visitQueue = [];
  12. var copyVisitQueue = [];
  13. while(originQueue.length > 0){
  14. var _data = originQueue.shift();
  15. var _obj = copyQueue.shift();
  16. visitQueue.push(_data);
  17. copyVisitQueue.push(_obj);
  18. for(var key in _data){
  19. var _value = _data[key]
  20. if(typeof _value !== 'object'){
  21. _obj[key] = _value;
  22. } else {
  23. //使用indexOf可以发现数组中是否存在相同的对象(实现indexOf的难点就在于对象比较)
  24. var index = visitQueue.indexOf(_value);
  25. if(index >= 0){
  26. // 出现环的情况不需要再取出遍历
  27. _obj[key] = copyVisitQueue[index];
  28. } else {
  29. originQueue.push(_value);
  30. _obj[key] = {};
  31. copyQueue.push(_obj[key]);
  32. }
  33. }
  34. }
  35. }
  36. return obj;
  37. }
  38. module.exports = {
  39. deepClone: deepClone
  40. };