আমি কীভাবে একটি সদৃশ মানচিত্রে একটি মানচিত্র অনুলিপি করব? [নকল]


95

আমি কীভাবে জাভাস্ক্রিপ্টে কোনও মানচিত্র ক্লোন / অনুলিপি করব?

আমি জানি কিভাবে অ্যারে ক্লোন করতে হয় তবে কীভাবে আমি কোনও মানচিত্র ক্লোন / অনুলিপি করব?

var myArray = new Array(1, 2, 3);
var copy    = myArray.slice();
// now I can change myArray[0] = 5; & it wont affect copy array

// Can I just do the same for map?
var myMap = new ?? // in javascript is it called a map?
var myMap = {"1": 1, "2", 2};
var copy  = myMap.slice(); 

4
ES6 আপনাকে দেয়let copy = {...myMap};
চুল্লী

উত্তর:


15

একটি সহজ উপায় (অগভীর অনুলিপি করার জন্য) উত্স মানচিত্রের প্রতিটি সম্পত্তি লক্ষ্য মানচিত্রে অনুলিপি করা:

var newMap = {};
for (var i in myMap)
   newMap[i] = myMap[i];

দ্রষ্টব্য: নতুন মানচিত্র [i] খুব ভালভাবেই আমার ম্যাপের মতো একই বস্তুর রেফারেন্স হতে পারে [i]


6
এটি কেবল অগভীর অনুলিপি ... যদি মাইম্যাপ [i] নিজেই মানচিত্র হয়?
স্টেফানো

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

4
আমি জানি, তবে আমি মনে করি আপনার উত্তরটি এই লেখা উচিত ছিল প্রথম স্থানে ;-)
স্টেফানো

6
এটি মানচিত্র নয় বরং একটি অবজেক্ট। ছোট এবং যথেষ্ট পার্থক্য। সিএফ. বিকাশকারী.মোজিলা.আর.ইন-
ইউএস

4
এটি সেটেটর এবং গেটারদের অ্যাক্সেসের অধিকারী প্রতিটি সম্পত্তি এটির কেবল একটি বস্তু হিসাবে অনুলিপি করবে না
আমানতে নিনজা

351

জাভাস্ক্রিপ্টে মানচিত্রের প্রবর্তনের সাথে সাথে কনস্ট্রাক্টর একটি পুনরাবৃত্তিযোগ্য গ্রহণযোগ্যতা বিবেচনা করে এটি বেশ সহজ:

var newMap = new Map(existingMap)

এখানে ডকুমেন্টেশন: https://developer.mozilla.org/en-US/docs/Web/ জাভা স্ক্রিপ্ট / রেফারেন্স / গ্লোবাল_অবজেক্টস / মানচিত্র


4
উপরের দিকে একটি ছোট সতর্কতা: এটির মতো মানচিত্রের ক্লোনিং করা Map.prototype.entriesএবং অনুরোধ করবে Map.prototype.set। তার মানে: আপনি একটি বর্গ যে ম্যাপ প্রসারিত লেখেন, তাহলে এবং মুছে ফেলা হয় এই দুটি পদ্ধতির পারেন, তাহলে কেবল লেখার new ExtendedMap( extendedMapObj )হবে কাজ না হলে বর্ধিত পদ্ধতি বৈশিষ্ট্য যে সুপার উপলব্ধ নয় উপর নির্ভর করে।

এটি কি গভীর ক্লোন বা কেবল অগভীর ক্লোন করে? ধরা যাক আমি মান হিসাবে বস্তু নেস্ট করেছেন
Madeo

তবে এটি কি গভীর বা অগভীর অনুলিপি করে ??
যোনাতন নীড়

4
এটি গভীর নয়, অগভীর অনুলিপিটি করবে: jsfiddle.net/jormwe69
জাপ

4
@PeterCoester ক্যান আমরা বলতে যে asymptotic var newMap = new Map(existingMap)হয় O(n)যেখানে nমানচিত্র চাবি / মান জোড়া সংখ্যা? আমি অনুমান করি যে ক্লোনিং অপারেশনটি ধ্রুবক নয় O(1)যদি আপনি যেমন বলেন, Map.prototype.entries
ডুবির

10

আপনি যে বিষয়ে কথা বলছেন তা কেবল একটি অবজেক্টের কারণে মানচিত্রের ক্লোন করা খুব সহজ। MapES6 এ একটি রয়েছে যা আপনার সন্ধান করা উচিত, তবে কোনও বিষয় অনুলিপি করতে কেবল ব্যবহার করুনObject.assign()

let map = {"a": 1, "b": 2}
let copy = Object.assign({}, map);

আপনি cloneDeep()লোডাশ থেকেও ব্যবহার করতে পারেন

let copy = cloneDeep(map);

Object.assignডিপ ক্লোনটির জন্য সতর্কতা: "যদি উত্সের মানটি কোনও বস্তুর সাথে সম্পর্কিত হয় তবে এটি কেবলমাত্র রেফারেন্স মানটি অনুলিপি করে।"
টম হেল

6

জিকুয়ের একটি অবজেক্ট বাড়ানোর পদ্ধতি রয়েছে (দুটি বস্তু একত্রিত করা) তবে এই পদ্ধতিটি খালি অবজেক্ট সরবরাহ করে কোনও বিষয় ক্লোন করতেও ব্যবহার করা যেতে পারে।

// Shallow copy
var newObject = jQuery.extend({}, oldObject);

// Deep copy
var newObject = jQuery.extend(true, {}, oldObject);

আরও তথ্য jQuery ডকুমেন্টেশন পাওয়া যাবে ।


3

সেখানে অন্তর্নির্মিত কিছুই নেই।

হয় একটি ভাল পরীক্ষিত পুনরাবৃত্ত সম্পত্তি কপিয়ার ব্যবহার করুন বা যদি পারফরম্যান্স কোনও সমস্যা না হয়, JSON এ সিরিয়াল করুন এবং আবার কোনও নতুন অবজেক্টে পার্স করুন।


2

কোনও অন্তর্নির্মিত ক্লোন / অনুলিপি নেই। আপনি নিজের পদ্ধতি অগভীর বা গভীর অনুলিপিতে লিখতে পারেন:

function shallowCopy(obj) {
    var result = {};
    for (var i in obj) {
        result[i] = obj[i];
    }
    return result;
}

function deepCopy(obj) {
    var result = {};
    for (var i in obj) {
        // recursion here, though you'll need some non-trivial logic
        // to avoid getting into an endless loop.
    }
    return result;
}

জাভাস্ক্রিপ্টের সমস্ত বস্তু গতিশীল, এবং নতুন বৈশিষ্ট্য বরাদ্দ করা যেতে পারে। আপনি যেমন "মানচিত্র" উল্লেখ করেন এটি আসলে একটি খালি অবজেক্ট। একটি অ্যারে এছাড়াও একটি বস্তু, যেমন পদ্ধতি sliceএবং বৈশিষ্ট্যাবলী মত length


আপনি যে দুটি ফাংশন লিখেছেন তার মধ্যে কী আলাদা তা বুঝতে পারিনি!
হাসান এ ইউসুফ

@ হাসানায়ুউসফ পার্থক্যটি কার্যকর করা হয়নি; একটি গভীর অনুলিপিতে আপনাকে অবশ্যই পুনরাবৃত্তি করতে হবে (প্রতিটি শিশুর জন্য ডিপকপি কল করুন), তবে বাচ্চাদের পিতামাতার একটি উল্লেখ থাকতে পারে (যেমন উইন্ডো.উইন্ডো 2 = উইন্ডো), আপনি অন্তহীন লুপে না গিয়ে সেই রেফারেন্সগুলি গভীরভাবে অনুলিপি করতে পারবেন না।
নিকোল

2

আপনার যদি কোনও মানচিত্রের গভীর অনুলিপি তৈরি করতে হয় তবে আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন:

new Map(JSON.parse(JSON.stringify(Array.from(source))));

sourceআসল মানচিত্র অবজেক্টটি কোথায় ।

দ্রষ্টব্য, মানচিত্রের মানগুলি সিরিয়ালযোগ্য নয় এমন সমস্ত ব্যবহারের ক্ষেত্রে এটি উপযুক্ত নাও হতে পারে, আরও তথ্যের জন্য দেখুন: https://stackoverflow.com/a/122704/10583071


আমি জেএসপিফার উপর একটি পরীক্ষা চালিয়েছি এবং দেখতে পেলাম যে একটি পুনরাবৃত্তি পদ্ধতি 10x দ্রুত: jsperf.com/ প্রদীপ
জ্যাক বার্ট

4
@ জ্যাকবার্ট দুঃখের বিষয়, আপনার দ্রুত প্রস্তাবিত বিকল্পটি ঠিক এটির একটি deep copyলক্ষ্য তৈরি করে না । সম্ভবত এটি এত দ্রুত কেন? Mapshallow copy
আলফোনসো এম। গার্সিয়া অ্যাস্টোরগা

@ AlfonsoM.GarcíaAstorga স্পষ্ট করার জন্য আপনাকে ধন্যবাদ (সেই অনুযায়ী উন্নত)। যে এটা তুমি সঠিক না একটি গভীর কপি। তবে এটি <10 কেবি ডেটা সহ একটি দ্রুত অনুলিপি। প্রস্তাবিত পরিপূরক পাঠ: v8.dev/blog/cost-of- জাভাস্ক্রিপ্ট ২০১৯#json
জ্যাক বার্ট

1

আমি লক্ষ্য করেছি যে মানচিত্রটির জন্য বিশেষ চিকিত্সা প্রয়োজন, এই থ্রেডের সমস্ত পরামর্শ সহ কোডটি হবে:

function deepClone( obj ) {
    if( !obj || true == obj ) //this also handles boolean as true and false
        return obj;
    var objType = typeof( obj );
    if( "number" == objType || "string" == objType ) // add your immutables here
        return obj;
    var result = Array.isArray( obj ) ? [] : !obj.constructor ? {} : new obj.constructor();
    if( obj instanceof Map )
        for( var key of obj.keys() )
            result.set( key, deepClone( obj.get( key ) ) );
    for( var key in obj )
        if( obj.hasOwnProperty( key ) )
            result[key] = deepClone( obj[ key ] );
    return result;
}

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.