κΈ°λ₯ μμ²:
_.extend()
λ° _.copy()
μ λΆμΈ 맀κ°λ³μλ₯Ό μ¬μ©νμ¬ κΉμ΄ μκ² λ§λ€κ±°λ λ³λμ κΉμ λ©μλλ₯Ό μ¬μ©ν μ μμ΅λκΉ?
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 ν¨ν€μ§λ‘ λ°κΏ¨μ΅λλ€.
@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
κ°μ₯ μ μ©ν λκΈ