javascript - Node.js একটি বস্তু cloning




(12)

সম্ভাবনা 1

নিম্ন frills গভীর কপি:

var obj2 = JSON.parse(JSON.stringify(obj1));

সম্ভাবনা 2 (অব্যবহৃত)

মনোযোগ: এই সমাধানটি এখন Node.js এর নথিতে অব্যবহৃত হিসাবে চিহ্নিত করা হয়েছে:

Util._extend () পদ্ধতি অভ্যন্তরীণ Node.js মডিউলগুলির বাইরে ব্যবহার করার উদ্দেশ্যে ছিল না। সম্প্রদায় খুঁজে পাওয়া যায় নি এবং এটি ব্যবহার করে।

এটি অব্যবহৃত এবং নতুন কোড ব্যবহার করা উচিত নয়। জাভাস্ক্রিপ্ট Object.assign () এর মাধ্যমে খুব অনুরূপ বিল্ট-ইন কার্যকারিতা নিয়ে আসে।

মূল উত্তর :

একটি অগভীর কপি জন্য, নোড এর অন্তর্নির্মিত util._extend() ফাংশন ব্যবহার করুন।

var extend = require('util')._extend;

var obj1 = {x: 5, y:5};
var obj2 = extend({}, obj1);
obj2.x = 6;
console.log(obj1.x); // still logs 5

নোডের _extend ফাংশনের উত্স কোড এখানে রয়েছে: https://github.com/joyent/node/blob/master/lib/util.js

exports._extend = function(origin, add) {
  // Don't do anything if add isn't an object
  if (!add || typeof add !== 'object') return origin;

  var keys = Object.keys(add);
  var i = keys.length;
  while (i--) {
    origin[keys[i]] = add[keys[i]];
  }
  return origin;
};

Node.js মধ্যে একটি বস্তুর ক্লোন করার সেরা উপায় কি

উদাহরণস্বরূপ আমি পরিস্থিতি এড়াতে চাই যেখানে:

var obj1 = {x: 5, y:5};
var obj2 = obj1;
obj2.x = 6;
console.log(obj1.x); // logs 6

বস্তুর বৈশিষ্ট্যাবলী হিসাবে জটিল ধরনের থাকতে পারে, তাই জন্য একটি সহজ (ওভার x1 মধ্যে var x) সমাধান হবে না। আমাকে কি একটি পুনরাবৃত্তিমূলক ক্লোন লিখতে হবে নাকি এমন কিছু আছে যা আমি দেখছি না?


"আপনার নিজের রোল" করতে না চান তাহলে সেখানে কিছু নোড মডিউল আছে। এটি ভাল দেখাচ্ছে: https://www.npmjs.com/package/clone

এটি বৃত্তাকার রেফারেন্স সহ সমস্ত ধরণের স্টাফ পরিচালনা করে বলে মনে হচ্ছে। github পৃষ্ঠা থেকে:

ক্লোন মাস্টার ক্লোনিং বস্তু, অ্যারে, তারিখ বস্তু, এবং RegEx বস্তু। সবকিছু পুনরাবৃত্তি ক্লোন করা হয়, যাতে আপনি বস্তুর অ্যারে তারিখ ক্লোন করতে পারেন, উদাহরণস্বরূপ। [...] সার্কুলার রেফারেন্স? হাঁ!


আপনি JQuery থেকে প্রসারিত ফাংশন ব্যবহার করতে পারেন:

var newClone= jQuery.extend({}, oldObject);  
var deepClone = jQuery.extend(true, {}, oldObject); 

একটি Node.js প্লাগইন খুব আছে:

https://github.com/shimondoodkin/nodejs-clone-extend

JQuery বা প্লাগইন ছাড়া এটি করতে এখানে পড়ুন:

http://my.opera.com/GreyWyvern/blog/show.dml/1725165


আপনি NodeJS মধ্যে SugarJS ব্যবহার করতে পারেন।

http://sugarjs.com/

তাদের খুব পরিষ্কার ক্লোন বৈশিষ্ট্য রয়েছে: http://sugarjs.com/api/Object/clone


আপনি যদি কফি-স্ক্রিপ্টটি ব্যবহার করেন তবে এটি এত সহজ:

newObject = {}
newObject[key] = value  for own key,value of oldObject

যদিও এটি একটি গভীর ক্লোন নয়।


আমি অবাক Object.assign উল্লেখ করা হয় নি।

let cloned = Object.assign({}, source);

যদি পাওয়া যায় (উদাহরণস্বরূপ বাবেল), আপনি অবজেক্ট স্প্রেড অপারেটর ব্যবহার করতে পারেন:

let cloned = { ... source };

এই কোডটিও কাজ করে কারণ Object.create () পদ্ধতি নির্দিষ্ট প্রোটোটাইপ বস্তু এবং বৈশিষ্ট্যগুলির সাথে একটি নতুন বস্তু তৈরি করে।

var obj1 = {x:5, y:5};

var obj2 = Object.create(obj1);

obj2.x; //5
obj2.x = 6;
obj2.x; //6

obj1.x; //5

একটি সত্য ক্লোন বিকল্প খুঁজছেন, আমি এখানে প্রতারণার লিঙ্ক জুড়ে stumbled:

http://my.opera.com/GreyWyvern/blog/show.dml/1725165

আমি সেই পৃষ্ঠায় সমাধানটি সংশোধন করেছি যাতে Object প্রোটোটাইপের সাথে যুক্ত ফাংশন সংখ্যাবহুল নয়। এখানে আমার ফলাফল:

Object.defineProperty(Object.prototype, 'clone', {
    enumerable: false,
    value: function() {
        var newObj = (this instanceof Array) ? [] : {};
        for (i in this) {
        if (i == 'clone') continue;
            if (this[i] && typeof this[i] == "object") {
                newObj[i] = this[i].clone();
            } else newObj[i] = this[i]
        } return newObj;
    }
});

আশা করি এই অন্য কেউ সাহায্য করে। মনে রাখবেন কিছু ক্যাভিটস আছে ... বিশেষ করে "ক্লোন" নামের বৈশিষ্ট্যগুলির সাথে। এই আমার জন্য ভাল কাজ করে। আমি এটা লেখার জন্য কোন ক্রেডিট নিতে না। আবার, আমি কেবল এটি কীভাবে সংজ্ঞায়িত করা হয়েছে তা পরিবর্তন করেছি।


নোড.জেসে একটি বস্তুর আসল ক্লোন (গভীর অনুলিপি) করতে কোনও অন্তর্নির্মিত উপায় নেই। কিছু চতুর প্রান্তের ক্ষেত্রে আছে যাতে আপনি স্পষ্টভাবে এই জন্য একটি লাইব্রেরি ব্যবহার করা উচিত। আমি আমার simpleoo লাইব্রেরী জন্য যেমন একটি ফাংশন লিখেছেন। লাইব্রেরি থেকে অন্য কিছু ব্যবহার না deepCopy আপনি deepCopy ফাংশন ব্যবহার করতে পারেন (যা খুবই ছোট) যদি আপনার এটি দরকার হয় না। এই ফাংশনটি অ্যারে, তারিখ এবং নিয়মিত এক্সপ্রেশন সহ একাধিক ডেটা ক্লোনগুলিকে ক্লোন করার ক্ষেত্রে সমর্থন করে, এটি পুনরাবৃত্তিমূলক রেফারেন্সগুলিকে সমর্থন করে এবং এটি এমন বস্তুর সাথেও কাজ করে যার কন্সট্রাকটর ফাংশনগুলির প্রয়োজনীয়তা রয়েছে।

এখানে কোডটি রয়েছে:

//If Object.create isn't already defined, we just do the simple shim, without the second argument,
//since that's all we need here
var object_create = Object.create;
if (typeof object_create !== 'function') {
    object_create = function(o) {
        function F() {}
        F.prototype = o;
        return new F();
    };
}

/**
 * Deep copy an object (make copies of all its object properties, sub-properties, etc.)
 * An improved version of http://keithdevens.com/weblog/archive/2007/Jun/07/javascript.clone
 * that doesn't break if the constructor has required parameters
 * 
 * It also borrows some code from http://.com/a/11621004/560114
 */ 
function deepCopy = function deepCopy(src, /* INTERNAL */ _visited) {
    if(src == null || typeof(src) !== 'object'){
        return src;
    }

    // Initialize the visited objects array if needed
    // This is used to detect cyclic references
    if (_visited == undefined){
        _visited = [];
    }
    // Ensure src has not already been visited
    else {
        var i, len = _visited.length;
        for (i = 0; i < len; i++) {
            // If src was already visited, don't try to copy it, just return the reference
            if (src === _visited[i]) {
                return src;
            }
        }
    }

    // Add this object to the visited array
    _visited.push(src);

    //Honor native/custom clone methods
    if(typeof src.clone == 'function'){
        return src.clone(true);
    }

    //Special cases:
    //Array
    if (Object.prototype.toString.call(src) == '[object Array]') {
        //[].slice(0) would soft clone
        ret = src.slice();
        var i = ret.length;
        while (i--){
            ret[i] = deepCopy(ret[i], _visited);
        }
        return ret;
    }
    //Date
    if (src instanceof Date) {
        return new Date(src.getTime());
    }
    //RegExp
    if (src instanceof RegExp) {
        return new RegExp(src);
    }
    //DOM Element
    if (src.nodeType && typeof src.cloneNode == 'function') {
        return src.cloneNode(true);
    }

    //If we've reached here, we have a regular object, array, or function

    //make sure the returned object has the same prototype as the original
    var proto = (Object.getPrototypeOf ? Object.getPrototypeOf(src): src.__proto__);
    if (!proto) {
        proto = src.constructor.prototype; //this line would probably only be reached by very old browsers 
    }
    var ret = object_create(proto);

    for(var key in src){
        //Note: this does NOT preserve ES5 property attributes like 'writable', 'enumerable', etc.
        //For an example of how this could be modified to do so, see the singleMixin() function
        ret[key] = deepCopy(src[key], _visited);
    }
    return ret;
};


var obj2 = JSON.parse(JSON.stringify(obj1));

npm install node-v8-clone

দ্রুততম cloner, এটি node.js থেকে নেটিভ ক্লোন পদ্ধতি খুলুন

var clone = require('node-v8-clone').clone;
var newObj = clone(obj, true); //true - deep recursive clone




node.js