Underscore: 심측 ν™•μž₯ 및 심측 볡사

에 λ§Œλ“  2011λ…„ 03μ›” 25일  Β·  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 λŒ“κΈ€

JavaScriptμ—μ„œ κΉŠμ€ 볡사 μž‘μ—…μ— λŒ€ν•œ 정말 쒋은 의미 체계가 μ—†λ‹€λŠ” 것이 λ‘λ ΅μŠ΅λ‹ˆλ‹€. κΈ°μ‘΄ κ΅¬ν˜„μ—λŠ” 쀑첩 λ°°μ—΄ λ³€κ²½ 및 쀑첩 Date 객체 볡사 μ‹€νŒ¨μ™€ 같은 λ‹€μ–‘ν•œ 버그가 μžˆμŠ΅λ‹ˆλ‹€. 이 κΈ°λŠ₯을 μ œμ•ˆν•˜λ €λ©΄ 방탄 κ΅¬ν˜„μ„ λ™λ°˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.

사싀, κΉŠμ€ 사본은 μžλ°” μŠ€ν¬λ¦½νŠΈμ—μ„œ ν™•μ‹€νžˆ μ§€μ €λΆ„ν•©λ‹ˆλ‹€. κ·Έλž˜λ„ 득보닀 싀이 λ§Žλ‹€κ³  ν•˜λŠ” 뢀뢄이 있겠죠? μ‚¬λžŒλ“€μ΄ μ˜ˆμƒλŒ€λ‘œ μž‘λ™ν•˜μ§€ μ•ŠλŠ” μ§€μ €λΆ„ν•œ 심측 볡사 방법을 계속 μž‘μ„±ν•˜κ²Œ ν•˜λŠ” 것은 주의 깊게 μ½”λ”©λ˜μ—ˆμ§€λ§Œ λ¬Έμ„œν™”λœ μ œν•œ 사항이 μžˆλŠ” 심측 볡사 방법을 μ‚¬μš©ν•˜λŠ” 것보닀 더 λ‚˜μ©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, 이 μ‚¬λžŒμ˜ μ†”λ£¨μ…˜μ€ ν›Œλ₯­ν•©λ‹ˆλ‹€. http://stackoverflow.com/questions/728360/copying-an-object-in-javascript/728694#728694

κ·ΈλŠ” λŒ€λΆ€λΆ„μ˜ 기지λ₯Ό 닀루고 μ˜¬λ°”λ₯΄κ²Œ μ²˜λ¦¬ν•˜μ§€ λͺ»ν•˜λŠ” 것을 λ¬Έμ„œν™”ν•©λ‹ˆλ‹€. κ·ΈλŠ” 객체에 Object, Array, Date, String, Number 및 Boolean μœ ν˜•λ§Œ ν¬ν•¨λ˜μ–΄ μžˆλ‹€κ³  κ°€μ •ν•˜κ³  λͺ¨λ“  객체 λ˜λŠ” λ°°μ—΄μ—λŠ” λ™μΌν•œ μœ ν˜•λ§Œ 포함될 것이라고 κ°€μ •ν•©λ‹ˆλ‹€.

예 -- 그리고 κ·Έ μ‚¬λžŒμ˜ μ†”λ£¨μ…˜μ‘°μ°¨λ„ μ‹€μ œλ‘œ μΆ©λΆ„ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ œλŒ€λ‘œ κ΅¬ν˜„ν•  수 μ—†λ‹€λ©΄ κ΅¬ν˜„ν•˜μ§€ 말아야 ν•©λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ μ‚¬μš©μžκ°€ μžμ‹ μ˜ κ΅¬ν˜„μ„ μ‹€ν–‰ν•˜λŠ” 것이 μ •λ§λ‘œ 더 λ‚«μŠ΅λ‹ˆκΉŒ? μ•„λ§ˆλ„ 훨씬 더 망가진 κ΅¬ν˜„μž…λ‹ˆκΉŒ?

μ•„λ‹ˆμš” -- JavaScriptμ—μ„œ λ”₯ μΉ΄ν”Όλ₯Ό ν•˜μ§€ μ•ŠλŠ” 것이 μ‚¬μš©μžμ—κ²Œ 더 μ’‹μŠ΅λ‹ˆλ‹€. 일반적으둜 κ°•λ ₯ν•œ 심측 볡사 κΈ°λŠ₯ 없이도 λ™μΌν•œ λͺ©μ μ„ λ‹¬μ„±ν•˜λŠ” 방법을 찾을 수 μžˆμŠ΅λ‹ˆλ‹€. λ³΅μ‚¬ν•˜λ €λŠ” 개체의 ꡬ쑰λ₯Ό 미리 μ•Œλ©΄ ...

μ•„, κ·Έλž˜μ„œ μ‚¬μš©μžκ°€ ν•„μš”ν•œ κ°’μœΌλ‘œ 개체의 μƒˆ μΈμŠ€ν„΄μŠ€λ₯Ό μˆ˜ν™”ν•˜λ„λ‘ μ œμ•ˆν•˜κ³  μžˆμŠ΅λ‹ˆκΉŒ? λ‚˜λŠ” 그것을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

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 객체 ν”„λ‘œν† νƒ€μž…μ„ λ³΅μ‚¬ν•˜μ§€ μ•Šκ³  κΈ°λŠ₯을 λ³΅μ‚¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ΄λŠ” μž¬κ·€μ μœΌλ‘œ μ μš©λ˜λ―€λ‘œ μ€‘μ²©λœ 개체의 ν”„λ‘œν† νƒ€μž…μ΄λ‚˜ κΈ°λŠ₯도 μ œλŒ€λ‘œ λ³΅μ‚¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

특히 : 개체 트리의 λ‚ μ§œλ₯Ό μ˜¬λ°”λ₯΄κ²Œ λ³΅μ‚¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. Dates와 ν•¨κ»˜ μž‘λ™ν•˜λ„λ‘ μˆ˜μ •ν•˜λ €λŠ” 경우 훨씬 더 큰 문제의 μž‘μ€ 증상을 ν•΄κ²°ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

였, λ§žμ•„. μ €λŠ” 주둜 "ν…œν”Œλ¦Ώ" κ°œμ²΄μ™€ 같은 ν•­λͺ©μ— λŒ€ν•œ μ°Έμ‘°λ₯Ό λŠλŠ” 데 μ‚¬μš©ν•˜λ―€λ‘œ 이와 같은 λ¬Έμ œλŠ” λ°œμƒν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ§„μ •ν•œ λ”₯ μΉ΄ν”Όκ°€ ν•„μš”ν•˜λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

Kurt Milam의 deepExtend λ―ΉμŠ€μΈμ„ npm νŒ¨ν‚€μ§€λ‘œ λ°”κΏ¨μŠ΅λ‹ˆλ‹€.

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

@michaelficarra , κΉŠμ€ 볡사가 μ–΄λ–»κ²Œ 일반 트리 ꡬ쑰λ₯Ό λ³΅μ œν•˜λŠ” 데 쒋은 μ†”λ£¨μ…˜μ΄ μ•„λ‹Œμ§€ μ„€λͺ…ν•΄μ£Όμ‹­μ‹œμ˜€.

@adamhooper one-liner deep copyλ₯Ό μ‚¬μš©ν•˜λ €λŠ” λͺ¨λ“  μ‚¬λžŒμ€ λ‚ μ§œμ— λŒ€ν•΄ μž‘λ™ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” 것을 μ•Œκ³  μžˆμŠ΅λ‹ˆλ‹€.
JSON.parse(JSON.stringify(객체))
사싀 그것은 λͺ¨λ“  객체 Dateλ₯Ό λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•©λ‹ˆλ‹€.

κΉŠμ€ λ³΅μ‚¬μ˜ 경우 -1μž…λ‹ˆλ‹€. ꡬ성 객체에 ν”„λ‘œν† νƒ€μž… 체인을 μ‚¬μš©ν•˜λŠ” 것은 항상 λ‚΄ν¬λœ μ˜΅μ…˜λ³΄λ‹€ API에 더 μ ν•©ν•©λ‹ˆλ‹€.

사싀 λ”₯ μΉ΄ν”Όλ₯Ό ν•˜λŠ” 곳이 있긴 ν•œλ°, νƒ€μž… 체크와 μΌμΉ˜ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— λ²”μš©μ΄ μ•„λ‹Œ μ•„μ£Ό ꡬ체적인 유슀 μΌ€μ΄μŠ€λΌκ³  μƒκ°ν•©λ‹ˆλ‹€. 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)});
  };

μž‘μ—… ν™˜κ²½μ—μ„œ λ”₯ ν΄λ‘œλ‹μ˜ 이점을 얻을 수 μžˆλŠ” μ‚¬μš© 사둀λ₯Ό 많이 μ ‘ν•©λ‹ˆλ‹€.

λ•Œλ‘œλŠ” λ³΅μž‘ν•œ μ›Ή μ•±μ˜ κΈ°λŠ₯이 μ—…λ°μ΄νŠΈλ˜κ³  μƒˆλ‘œμš΄ νŒ¨λŸ¬λ‹€μž„μœΌλ‘œ ν™•μž₯될 λ•Œ λ°μ΄ν„°λ² μ΄μŠ€ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μ„ μˆ˜ν–‰ν•΄μ•Ό ν•©λ‹ˆλ‹€. 원본 μ°Έμ‘°κ°€ μ‘°μž‘λ˜μ§€ μ•ŠλŠ” 것을 μ„ ν˜Έν•  λ•Œ λ°μ΄ν„°μ—μ„œ ν•΄μ‹œλ₯Ό μƒμ„±ν•˜λŠ” 것과 같은 μž‘μ—…μ„ μˆ˜ν–‰ν•΄μ•Ό ν•  λ•Œ λ°μ΄ν„°μ˜ 전체 볡사본이 맀우 μœ μš©ν•©λ‹ˆλ‹€. μ €λŠ” 우리의 λ°©λŒ€ν•œ λ°μ΄ν„°λ² μ΄μŠ€μ— μžˆλŠ” 단일 λ¬Έμ„œκ°€ '평평'ν•˜λ‹€κ³  μƒκ°ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 쀑첩 속성은 μ–΄λ””μ—λ‚˜ μ‘΄μž¬ν•©λ‹ˆλ‹€.

λ˜ν•œ λ•Œλ‘œλŠ” 개체의 볡사본을 μ›Ή μ‘μš© ν”„λ‘œκ·Έλž¨ λ‚΄μ˜ λ‹€λ₯Έ μ„œλΉ„μŠ€λ‘œ 보내 μž‘μ—…μ„ μˆ˜ν–‰ν•  μž‘μ—…μ„ κ²°μ •ν•˜κΈ° 전에 μž‘μ—…ν•˜κ³  싢을 λ•Œκ°€ μžˆμŠ΅λ‹ˆλ‹€. 참쑰둜 μ€‘μ²©λœ 속성을 κ°–λŠ” 것은 볡제된 개체λ₯Ό κ°–λŠ” λͺ©μ μ„ λ¬΄νš¨ν™”ν•©λ‹ˆλ‹€. 볡제된 개체의 μš”μ μ€ μ›λž˜ μ°Έμ‘°λ₯Ό κ·ΈλŒ€λ‘œ λ‘λŠ” κ²ƒμž…λ‹ˆλ‹€. 더 κΉŠμ€ μˆ˜μ€€μ— λŒ€ν•œ μ°Έμ‘°λ₯Ό λ„μž…ν•˜μžλ§ˆμž 전체 λͺ©μ μ΄ λ¬΄μ˜λ―Έν•΄μ§‘λ‹ˆλ‹€.

개체λ₯Ό 깊이 νƒμƒ‰ν•œ λ‹€μŒ κ°€μž₯ κΉŠμ€ λ ˆμ΄μ–΄μ—μ„œ λ£¨νŠΈκΉŒμ§€ μž¬κ΅¬μ„±ν•  수 μžˆλŠ” μ μ ˆν•œ 방법이 μžˆλ‹€κ³  ν™•μ‹ ν•©λ‹ˆλ‹€.

Lodash에 μžˆμŠ΅λ‹ˆλ‹€ - https://lodash.com/docs/4.17.5#cloneDeep

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰