Underscore: рдбреАрдк рдПрдХреНрд╕рдЯреЗрдВрдб рдФрд░ рдбреАрдк рдХреЙрдкреА

рдХреЛ рдирд┐рд░реНрдорд┐рдд 25 рдорд╛рд░реНрдЪ 2011  ┬╖  28рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: jashkenas/underscore

рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓реЗрдЦ рдорд╛рдВрдЧрдирд╛:
рдХреНрдпрд╛ _.extend() рдФрд░ _.copy() рдкрд░ рдЙрдиреНрд╣реЗрдВ рдЧрд╣рд░рд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЧрд╣рд░реА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдмреВрд▓рд┐рдпрди рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛?

enhancement wontfix

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

_.deepClone = function(obj) {
      return (!obj || (typeof obj !== 'object'))?obj:
          (_.isString(obj))?String.prototype.slice.call(obj):
          (_.isDate(obj))?new Date(obj.valueOf()):
          (_.isFunction(obj.clone))?obj.clone():
          (_.isArray(obj)) ? _.map(obj, function(t){return _.deepClone(t)}):
          _.mapObject(obj, function(val, key) {return _.deepClone(val)});
  };

рд╕рднреА 28 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореБрдЭреЗ рдбрд░ рд╣реИ рдХрд┐ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЧрд╣рд░реА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ рдЕрдЪреНрдЫрд╛ рдЕрд░реНрдерд╢рд╛рд╕реНрддреНрд░ рдирд╣реАрдВ рд╣реИред рдореМрдЬреВрджрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдмрдЧ рд╣реИрдВ, рдЬреИрд╕реЗ рдиреЗрд╕реНрдЯреЗрдб рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рдмрджрд▓рдирд╛, рдФрд░ рдиреЗрд╕реНрдЯреЗрдб рджрд┐рдирд╛рдВрдХ рд╡рд╕реНрддреБрдУрдВ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд╣реЛрдирд╛ред рдпрджрд┐ рдЖрдк рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдмреБрд▓реЗрдЯрдкреНрд░реВрдл рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рд╕рдЪ рд╣реИ, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЧрд╣рд░реА рдкреНрд░рддрд┐рдпрд╛рдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЧрдбрд╝рдмрдбрд╝ рд╣реИрдВред рд╡рд╣рд╛рдБ рдХреБрдЫ рдмрд┐рдВрджреБ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд╣рд╛рдБ рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рд▓рд╛рдн рд╣рд╛рдирд┐рдпреЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рд╣реИ рдирд╛? рд▓реЛрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рд▓рдЧрд╛рддрд╛рд░ рдХреНрд░рдореА рдбреАрдк-рдХреЙрдкреА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдирд╛ рдЬреЛ рдЕрдкреЗрдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдПрдХ рдЧрд╣рд░реА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рднреА рдмрджрддрд░ рд╣реИ рдЬрд┐рд╕реЗ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдХреЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреНрд░рд▓реЗрдЦрд┐рдд рд╕реАрдорд╛рдПрдВ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдЖрджрдореА рдХрд╛ рд╕рдорд╛рдзрд╛рди рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ: http://stackoverflow.com/questions/728360/copying-an-object-in-javascript/728694#728694

рд╡рд╣ рдЕрдзрд┐рдХрд╛рдВрд╢ рдард┐рдХрд╛рдиреЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЙрди рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рд╡рд╣ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрднрд╛рд▓ рдирд╣реАрдВ рдкрд╛рдПрдЧрд╛ред рд╡рд╣ рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рд╡рд╕реНрддреБ рдореЗрдВ рдХреЗрд╡рд▓ рдпреЗ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ: рд╡рд╕реНрддреБ, рд╕рд░рдгреА, рджрд┐рдирд╛рдВрдХ, рд╕реНрдЯреНрд░рд┐рдВрдЧ, рд╕рдВрдЦреНрдпрд╛, рдФрд░ рдмреВрд▓рд┐рдпрди, рдФрд░ рд╡рд╣ рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рд╡рд╕реНрддреБ рдпрд╛ рд╕рд░рдгреА рдореЗрдВ рдХреЗрд╡рд▓ рд╡рд╣реА рд╣реЛрдЧрд╛ред

рд╣рд╛рдВ - рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЙрд╕ рдЖрджрдореА рдХрд╛ рд╕рдорд╛рдзрд╛рди рднреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдлреА рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИред рдЕрдЧрд░ рд╣рдо рдЗрд╕реЗ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдпрдВ рдХреЛ рд░реЛрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИ, рд╢рд╛рдпрдж рдФрд░ рднреА рдЕрдзрд┐рдХ рдЯреВрдЯрд╛ рд╣реБрдЖ, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди?

рдирд╣реАрдВ -- рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдмреЗрд╣рддрд░ рд╣реИ рдХрд┐ рд╡реЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдбреАрдк рдХреЙрдкреА рди рдХрд░реЗрдВред рдЬрд┐рд╕ рд╡рд╕реНрддреБ рдХреА рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрд╕рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЬрд╛рдирдХрд░ рдЖрдк рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдордЬрдмреВрдд рдЧрд╣рд░реА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрд┐рдирд╛ рдЙрд╕реА рдЕрдВрдд рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдвреВрдВрдв рд╕рдХрддреЗ рд╣реИрдВред

рдЖрд╣, рддреЛ рдЖрдк рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрд╡рд╢реНрдпрдХ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд╕реНрддреБ рдХрд╛ рдПрдХ рдирдпрд╛ рдЙрджрд╛рд╣рд░рдг рд╣рд╛рдЗрдбреНрд░реЗрдЯ рдХрд░рддрд╛ рд╣реИ? рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реБред

Jquery.extend рдореЗрдВ рдЧрд╣рд░рд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИред

+1 рдЧрд╣рд░реЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд▓рд┐рдП, рдЪрд╛рд╣реЗ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдХрд┐рддрдирд╛ рднреА рдХрдард┐рди рдХреНрдпреЛрдВ рди рд╣реЛред

рдЗрд╕рдХреЗ рд▓рд┐рдП +2 - рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреА рдмрд╛рдд рд╣реИ (рдпрд╛рдиреА рдХрдо рд╕реЗ рдХрдо рд╕рд╣реА рд╕рдорд╛рдзрд╛рди рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рдирд╛)ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬреИрд╕рд╛ рдКрдкрд░ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ jQuery рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рдХрд┐рдирд╛рд░реЗ рдХреЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХрд╛рдлреА рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИред рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╣рд▓реНрдХреЗ рд╡рдЬрди рд╡рд╛рд▓реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

@kmalakoff рдиреЗ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд┐рдЦрд╛ рд╣реИ, рдЖрдкрдХреЛ рдЙрд╕реЗ рдХреБрдЫ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдиреА рдЪрд╛рд╣рд┐рдП! :)

рдЖрдк рдореЗрд░реЗ рдореВрд▓ _.cloneToDepth рдХреЛ _clone рдХреЗ рд╕рд╛рде рдорд░реНрдЬ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдмрд╕ рдПрдХ рдЧрд╣рд░рд╛рдИ рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ ....

  // Create a duplicate of a container of objects to any zero-indexed depth.
  _.cloneToDepth = _.clone = function(obj, depth) {
    if (typeof obj !== 'object') return obj;
    var clone = _.isArray(obj) ? obj.slice() : _.extend({}, obj);
    if (!_.isUndefined(depth) && (depth > 0)) {
      for (var key in clone) {
        clone[key] = _.clone(clone[key], depth-1);
      }
    }
    return clone;
  };

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВрдиреЗ _.own рдФрд░ _.disown рд▓рд┐рдЦрд╛ рд╣реИ рдЬреЛ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдореНрдореЗрд▓рди рдкреЗрд╢ рдХрд░рддрд╛ рд╣реИ (рдпрд╛ рддреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ/рд░рд┐рд▓реАрдЬ рдпрд╛ рдХреНрд▓реЛрди/рдирд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рдЬреЛрдбрд╝реЗ)ред рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рд╕реНрддрд░ рдиреАрдЪреЗ рд░рд┐рдХрд░реНрд╕ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрд▓ рд░рд┐рдХрд░реНрд╕рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдХрд▓реНрдк рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдореИрдВ рдПрдХ рдЙрдкрдпреЛрдЧ рдХреЗрд╕ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ!)

  _.own = function(obj, options) {
    if (!obj || (typeof(obj)!='object')) return obj;
    options || (options = {});
    if (_.isArray(obj)) {
      if (options.share_collection) { _.each(obj, function(value) { _.own(value, {prefer_clone: options.prefer_clone}); }); return obj; }
      else { var a_clone =  []; _.each(obj, function(value) { a_clone.push(_.own(value, {prefer_clone: options.prefer_clone})); }); return a_clone; }
    }
    else if (options.properties) {
      if (options.share_collection) { _.each(obj, function(value, key) { _.own(value, {prefer_clone: options.prefer_clone}); }); return obj; }
      else { var o_clone = {}; _.each(obj, function(value, key) { o_clone[key] = _.own(value, {prefer_clone: options.prefer_clone}); }); return o_clone; }
    }
    else if (obj.retain) {
      if (options.prefer_clone && obj.clone) return obj.clone();
      else obj.retain();
    }
    else if (obj.clone) return obj.clone();
    return obj;
  };

  _.disown = function(obj, options) {
    if (!obj || (typeof(obj)!='object')) return obj;
    options || (options = {});
    if (_.isArray(obj)) {
      if (options.clear_values) { _.each(obj, function(value, index) { _.disown(value); obj[index]=null; }); return obj; }
      else {
        _.each(obj, function(value) { _.disown(value); });
        obj.length=0; return obj;
      }
    }
    else if (options.properties) {
      if (options.clear_values) { _.each(obj, function(value, key) { _.disown(value); obj[key]=null; }); return obj; }
      else {
        _.each(obj, function(value) { _.disown(value); });
        for(key in obj) { delete obj[key]; }
        return obj;
      }
    }
    else if (obj.release) obj.release();
    else if (obj.destroy) obj.destroy();
    return obj;
  };

рдФрд░ рдпрджрд┐ рдЖрдк рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЙрджреНрджреЗрд╢реНрдп рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рдХреНрд▓реЛрди:

  // Create a duplicate of all objects to any zero-indexed depth.
  _.deepClone = function(obj, depth) {
    if (typeof obj !== 'object') return obj;
    if (_.isString(obj)) return obj.splice();
    if (_.isDate(obj)) return new Date(obj.getTime());
    if (_.isFunction(obj.clone)) return obj.clone();
    var clone = _.isArray(obj) ? obj.slice() : _.extend({}, obj);
    if (!_.isUndefined(depth) && (depth > 0)) {
      for (var key in clone) {
        clone[key] = _.deepClone(clone[key], depth-1);
      }
    }
    return clone;
  };

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдПрдХ рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдПрдХ рдЧрд╣рд░реА рдкреНрд░рддрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдХреЛ рдвреВрдВрдврдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛ред

рдореИрдВ рдХрд▓ рдЕрдкрдиреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕рдВрддреБрд╖реНрдЯ рдирд╣реАрдВ рдерд╛ (рдЖрдзреА рд░рд╛рдд рдХреЗ рдмрд╛рдж рдХреЛрдб рдирд╣реАрдВ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП) ... рдореИрдВ рджреЛ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЖрдпрд╛ рд╣реВрдВ ( _.cloneToDepth рдореВрд▓ рд░реВрдк рд╕реЗ рдХреЗрд╡рд▓ рдХрдВрдЯреЗрдирд░ рдХреЛ рдХреНрд▓реЛрди рдХрд░рддрд╛ рд╣реИ, рдореВрд▓ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рдмрдирд╛рдП рд░рдЦрддрд╛ рд╣реИ рдФрд░ _.deepClone рдЬреЛ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рддрд╛ рд╣реИ):

  // Create a duplicate of a container of objects to any zero-indexed depth.
  _.cloneToDepth = _.containerClone = _.clone = function(obj, depth) {
    if (!obj || (typeof obj !== 'object')) return obj;  // by value
    var clone;
    if (_.isArray(obj)) clone = Array.prototype.slice.call(obj);
    else if (obj.constructor!=={}.constructor) return obj; // by reference
    else clone = _.extend({}, obj);
    if (!_.isUndefined(depth) && (depth > 0)) {
      for (var key in clone) {
        clone[key] = _.clone(clone[key], depth-1);
      }
    }
    return clone;
  };

  // Create a duplicate of all objects to any zero-indexed depth.
  _.deepClone = function(obj, depth) {
    if (!obj || (typeof obj !== 'object')) return obj;  // by value
    else if (_.isString(obj)) return String.prototype.slice.call(obj);
    else if (_.isDate(obj)) return new Date(obj.valueOf());
    else if (_.isFunction(obj.clone)) return obj.clone();
    var clone;
    if (_.isArray(obj)) clone = Array.prototype.slice.call(obj);
    else if (obj.constructor!=={}.constructor) return obj; // by reference
    else clone = _.extend({}, obj);
    if (!_.isUndefined(depth) && (depth > 0)) {
      for (var key in clone) {
        clone[key] = _.deepClone(clone[key], depth-1);
      }
    }
    return clone;
  };

рдЬреИрд╕рд╛ рдХрд┐ @michaelficarra рдмрддрд╛рддреЗ рд╣реИрдВ, рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореИрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ:

1) _.own / _.disown рдЬрдм рдореИрдВ рдЙрди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬрд┐рдирдореЗрдВ рдЬрдЯрд┐рд▓ рдЬреАрд╡рдирдЪрдХреНрд░ рдФрд░/рдпрд╛ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рдореЙрдбрд▓ рд╣реИрдВ (рдЬреИрд╕реЗ рд╕рдВрджрд░реНрдн рдЧрд┐рдирддреА рдареАрдХ рд╕реЗ рд╕рд╛рдл рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)
2) рдореИрдВрдиреЗ _.cloneToDepth / _.containerClone (рд╢рд╛рдпрдж рд╣реА рдХрднреА!) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛ рдЬрдм рдореЗрд░реЗ рдкрд╛рд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЬрдЯрд┐рд▓, рдиреЗрд╕реНрдЯреЗрдб рд╡рд┐рдХрд▓реНрдк рдереЗред
3) рдореБрдЭреЗ рдХрднреА рднреА _.deepClone , рд▓реЗрдХрд┐рди рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ _.clone рдпрджрд┐ рдЖрдк рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рд▓рдЪреАрд▓реЗ рдврдВрдЧ рд╕реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдПред рдореИрдВ рдирд╣реАрдВ рдХрд░рддрд╛ рдкрд░рд╡рд╛рд╣ рд╣реИ рдХрд┐ рдЖрдк рдореБрдЭреЗ рдХреНрдпрд╛ рджреЗрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдореВрд▓ рдкрд░ рджреБрд╖реНрдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ - рд╣рд╛рд▓рд╛рдВрдХрд┐ рддрд╛рд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдорд╛рдорд▓рд╛ рд╣реИ)ред

рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рдХреЛрдб рдФрд░ рдкрд░реАрдХреНрд╖рдг рд╕рдмрдорд┐рдЯ рдХрд┐рдП рд╣реИрдВ: https://github.com/kmalakoff/underscore-awesomer/commit/0cf6008f16ad6e6daf60caf456021693ef33fec5

рдиреЛрдЯ: рдЬреЛ рд▓реЛрдЧ рдПрдХ-рдкрдВрдХреНрддрд┐ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рдЕрдЯрдХреЗ рд╣реБрдП рд╣реИрдВ, рд╡реЗ рдЕрдиреБрдорд╛рдирд┐рдд рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рд╕рд╛рде рд╕рд╛рдзрд╛рд░рдг рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдкреВрд░реНрдг рдбреАрдк-рдХреНрд▓реЛрди рдХреЗрд╡рд▓ JSON.parse(JSON.stringify(object)) рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@adamhooper рдХреНрдпрд╛ рдпрд╣ рд╡рд┐рдзрд┐ рдЧреБрдг рдпрд╛ рдХреБрдЫ рдЦреЛ рджреЗрддреА рд╣реИ? рдЕрдзреВрд░рд╛ рдХреНрдпреЛрдВ рд╣реИ?

@diversario рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдирд╣реАрдВ рдмрдирд╛рдПрдЧрд╛, рдФрд░ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдирд╣реАрдВ рдмрдирд╛рдПрдЧрд╛ред рдпрд╣ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ - рдЗрд╕рд▓рд┐рдП рдпрд╣ рдиреЗрд╕реНрдЯреЗрдб рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдпрд╛ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдареАрдХ рд╕реЗ рдХреЙрдкреА рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ: рдпрд╣ рдЖрдкрдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдЯреНрд░реА рдореЗрдВ рдХрд┐рд╕реА рднреА рджрд┐рдирд╛рдВрдХ рдХреЛ рдареАрдХ рд╕реЗ рдХреЙрдкреА рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдФрд░ рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рддрд┐рдерд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдареАрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдареАрдХ рд╣реИ, рдЖрдк рдмрд╕ рдПрдХ рдмрд╣реБрдд рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рд▓рдХреНрд╖рдг рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдЕрд░реЗ рд╣рд╛рдВред рдореИрдВ рдЬреНрдпрд╛рджрд╛рддрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ "рдЯреЗрдореНрдкрд▓реЗрдЯ" рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рддреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдРрд╕рд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЧрд╣рд░реА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИред

рдореИрдВрдиреЗ рдХрд░реНрдЯ рдорд┐рд▓рдо рдХреЗ рдбреАрдкрдПрдХреНрд╕рдЯреЗрдВрдб рдорд┐рдХреНрд╕рд┐рди рдХреЛ npm рдкреИрдХреЗрдЬ рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИред

https://github.com/pygy/undescoreDeepExtend/

@michaelficarra , рдХреГрдкрдпрд╛ рдмрддрд╛рдПрдВ рдХрд┐ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡реГрдХреНрд╖ рд╕рдВрд░рдЪрдирд╛ рдХреА рдХреНрд▓реЛрдирд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЧрд╣рд░реА-рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдХреИрд╕реЗ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ?

рдЖрдк рд╕рднреА рдХреЗ рд▓рд┐рдП @adamhooper рд╡рди-рд▓рд╛рдЗрдирд░ рдбреАрдк рдХреЙрдкреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕ рдЕрд╡рдЧрдд рд░рд╣реЗрдВ рдХрд┐ рдпрд╣ рддрд╛рд░реАрдЦреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ
JSON.parse (JSON.stringify (рд╡рд╕реНрддреБ))
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдХрд┐рд╕реА рднреА рд╡рд╕реНрддреБ рджрд┐рдирд╛рдВрдХ рдХреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ

-1 рдбреАрдк рдХреЙрдкреА рдХреЗ рд▓рд┐рдПред рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣рдореЗрд╢рд╛ рдЖрдкрдХреЗ рдПрдкреАрдЖрдИ рдХреЛ рдиреЗрд╕реНрдЯреЗрдб рд╡рд┐рдХрд▓реНрдкреЛрдВ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред

рдЕрд╕рд▓ рдореЗрдВ рдЧрд╣рд░реА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдЬрдЧрд╣ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЯрд╛рдЗрдк рдЪреЗрдХрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдПрдХ рдмрд╣реБрдд рд╣реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдпреЛрдЧ рдХреЗрд╕ рд╣реИ, рди рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдЙрджреНрджреЗрд╢реНрдпред JSON рд╕реНрдХреАрдорд╛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдпрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд▓реЛрдбрд░ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рдЕрдиреБрдХреВрд▓ рд╣реИред рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЯреВрд▓ рдмреЗрд▓реНрдЯ рдирд╣реАрдВред

рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ _.extend({}, obj1, { prop1: 1, prop2: 2 }) рд╡рд╣ рд╣реИ рдЬреЛ рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ:

  • рдореБрдЭреЗ рдПрдХ рдирдИ рд╡рд╕реНрддреБ рджреЗрддрд╛ рд╣реИ
  • рдореЗрд░реЗ рд╕реНрд░реЛрдд рд╡рд╕реНрддреБ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░
  • рдЧрд╣рд░реА рдирдХрд▓ рдирд╣реАрдВ рд╣реИ
_.deepClone = function(obj) {
      return (!obj || (typeof obj !== 'object'))?obj:
          (_.isString(obj))?String.prototype.slice.call(obj):
          (_.isDate(obj))?new Date(obj.valueOf()):
          (_.isFunction(obj.clone))?obj.clone():
          (_.isArray(obj)) ? _.map(obj, function(t){return _.deepClone(t)}):
          _.mapObject(obj, function(val, key) {return _.deepClone(val)});
  };

рд╣рдо рдЕрдкрдиреЗ рдХрд╛рдо рдХреЗ рдорд╛рд╣реМрд▓ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рднрд╛рдЧ рд▓реЗрддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐ рдЧрд╣рд░реА рдХреНрд▓реЛрдирд┐рдВрдЧ рд╕реЗ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛрдЧрд╛ред

рдХрднреА-рдХрднреА, рдЖрдкрдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рдЬрдм рдПрдХ рдЬрдЯрд┐рд▓ рд╡реЗрдм рдРрдк рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдирдП рдкреНрд░рддрд┐рдорд╛рди рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛ рдХреА рдПрдХ рдбреАрдк рдХреЙрдкреА рддрдм рдмрд╣реБрдд рдорджрджрдЧрд╛рд░ рд╣реЛрддреА рд╣реИ, рдЬрдм рдбреЗрдЯрд╛ рд╕реЗ рд╣реИрд╢ рдЬреЗрдирд░реЗрдЯ рдХрд░рдиреЗ рдЬреИрд╕реЗ рдСрдкрд░реЗрд╢рди рдХрд░рдиреЗ рдкрдбрд╝рддреЗ рд╣реИрдВ, рдЬрдм рдореВрд▓ рд░реЗрдлрд░реЗрдВрд╕ рдореЗрдВ рд╣реЗрд░-рдлреЗрд░ рди рдХрд░рдиреЗ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреА рдЬрд╛рддреА рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рд╡рд┐рд╢рд╛рд▓ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдПрдХ рднреА рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ 'рдлреНрд▓реИрдЯ' рд╣реИред рдиреЗрд╕реНрдЯреЗрдб рдЧреБрдг рд╣рд░ рдЬрдЧрд╣ рдореМрдЬреВрдж рд╣реИрдВред

рд╕рд╛рде рд╣реА, рдХрднреА-рдХрднреА рдЖрдк рдЕрдкрдиреЗ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рднреАрддрд░ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдПрдХ рдкреНрд░рддрд┐ рдХрд┐рд╕реА рднрд┐рдиреНрди рд╕реЗрд╡рд╛ рдХреЛ рднреЗрдЬрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ рдпрд╣ рддрдп рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рдВрдЪрд╛рд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИред рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рдиреЗрд╕реНрдЯреЗрдб рдЧреБрдг рд╣реЛрдиреЗ рд╕реЗ рдХреНрд▓реЛрди рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЛрдиреЗ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдХреНрд▓реЛрди рдХрд┐рдП рдЧрдП рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рд╕рдВрдкреВрд░реНрдг рдмрд┐рдВрджреБ, рдЗрдореЛ, рдореВрд▓ рд╕рдВрджрд░реНрдн рдХреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЫреЛрдбрд╝рдирд╛ рд╣реИред рдЬреИрд╕реЗ рд╣реА рдЖрдк рдЧрд╣рд░реЗ рд╕реНрддрд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╣реИрдВ, рдкреВрд░рд╛ рдЙрджреНрджреЗрд╢реНрдп рд╡реНрдпрд░реНрде рд╣реИред

рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЛ рдЙрд╕рдХреА рдЧрд╣рд░рд╛рдИ рддрдХ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдлрд┐рд░ рд╕рдмрд╕реЗ рдЧрд╣рд░реА рдкрд░рдд рд╕реЗ рдЬрдбрд╝ рддрдХ рдХрд╛ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд▓реЛрдбрд╛рд╢ рдХреЗ рдкрд╛рд╕ рд╣реИ - https://lodash.com/docs/4.17.5#cloneDeep

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

ksullivan picture ksullivan  ┬╖  9рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jdalton picture jdalton  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

xiaoliwang picture xiaoliwang  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

sky0014 picture sky0014  ┬╖  8рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

clouddueling picture clouddueling  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ