You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

60 lines
1.2 KiB

  1. /*!
  2. * merge-deep <https://github.com/jonschlinkert/merge-deep>
  3. *
  4. * Copyright (c) 2014-2015, Jon Schlinkert.
  5. * Licensed under the MIT License.
  6. */
  7. 'use strict';
  8. var union = require('arr-union');
  9. var clone = require('clone-deep');
  10. var typeOf = require('kind-of');
  11. module.exports = function mergeDeep(orig, objects) {
  12. if (!isObject(orig) && !Array.isArray(orig)) {
  13. orig = {};
  14. }
  15. var target = clone(orig);
  16. var len = arguments.length;
  17. var idx = 0;
  18. while (++idx < len) {
  19. var val = arguments[idx];
  20. if (isObject(val) || Array.isArray(val)) {
  21. merge(target, val);
  22. }
  23. }
  24. return target;
  25. };
  26. function merge(target, obj) {
  27. for (var key in obj) {
  28. if (key === '__proto__' || !hasOwn(obj, key)) {
  29. continue;
  30. }
  31. var oldVal = obj[key];
  32. var newVal = target[key];
  33. if (isObject(newVal) && isObject(oldVal)) {
  34. target[key] = merge(newVal, oldVal);
  35. } else if (Array.isArray(newVal)) {
  36. target[key] = union([], newVal, oldVal);
  37. } else {
  38. target[key] = clone(oldVal);
  39. }
  40. }
  41. return target;
  42. }
  43. function hasOwn(obj, key) {
  44. return Object.prototype.hasOwnProperty.call(obj, key);
  45. }
  46. function isObject(val) {
  47. return typeOf(val) === 'object' || typeOf(val) === 'function';
  48. }