javascript - array in java




মান দ্বারা অ্যারে কপি (20)

ES2015 থেকে,

var arr2 = [...arr1];

জাভাস্ক্রিপ্টে অন্য অ্যারেতে একটি অ্যারের অনুলিপি করার সময়:

var arr1 = ['a','b','c'];
var arr2 = arr1;
arr2.push('d');  //Now, arr1 = ['a','b','c','d']

আমি বুঝতে পেরেছি যে arr1 একটি নতুন, স্বাধীন অ্যারের পরিবর্তে arr1 হিসাবে একই অ্যারে বোঝায়। আমি কিভাবে দুটি স্বাধীন অ্যারে পেতে অ্যারের অনুলিপি করতে পারি?


ES6 অ্যারের বস্তু ধারণকারী

cloneArray(arr) {
    return arr.map(x => ({ ...x }));
}

অনেক পদ্ধতির চেষ্টা করার পর আমি এটি করেছি:

var newArray = JSON.parse(JSON.stringify(orgArray));

এটি একটি নতুন গভীর কপি তৈরি করবে যা প্রথমটির সাথে সম্পর্কিত নয় (একটি অগভীর কপি নয়)।

এছাড়াও এটি সম্ভবত ইভেন্ট এবং ফাংশনগুলি ক্লোন করবে না, তবে ভাল জিনিস আপনি এক লাইনে এটি করতে পারেন এবং এটি কোনও বস্তুর জন্য ব্যবহার করা যেতে পারে (অ্যারে, স্ট্রিং, সংখ্যা, বস্তু ...)


অ্যারে কপি করার জন্য আপনি অ্যারে স্প্রেড ব্যবহার করতে পারেন।

const itemsCopy = [...items];

এছাড়াও যদি বিদ্যমান অংশটির সাথে একটি নতুন অ্যারে তৈরি করতে চান তবে এটির অংশ:

var parts = ['shoulders', 'knees'];
var lyrics = ['head', ...parts, 'and', 'toes'];

অ্যারে স্প্রেডগুলি এখন সকল প্রধান ব্রাউজারে সমর্থিত তবে আপনাকে পুরানো সহায়তা ব্যবহার টাইপcript বা বাবেল এবং ES5 এ কম্পাইল করার প্রয়োজন হলে।

developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…


আপনি নিম্নলিখিত ভাবে তা করতে পারেন:
arr2 = arr1.map(x => Object.assign({}, x));


আপনি যদি ECMAScript 6 এর পরিবেশে থাকেন তবে developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… ব্যবহার করে আপনি এটি এভাবে করতে পারেন:

var arr1 = ['a','b','c'];
var arr2 = [...arr1]; //copy arr1
arr2.push('d');

console.log(arr1)
console.log(arr2)
<script src="http://www.wzvang.com/snippet/ignore_this_file.js"></script>


আমি ব্যক্তিগতভাবে Array.from একটি আরো পঠনযোগ্য সমাধান মনে করি। উপায় দ্বারা, শুধু তার ব্রাউজার সমর্থন সাবধান।

//clone
let x = [1,2,3];
let y = Array.from(x);

//deep clone
let clone = arr => Array.from(arr,item => Array.isArray(item) ? clone(item) : item);
let x = [1,[],[[]]];
let y = clone(x);

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

আপনার জাভাস্ক্রিপ্ট ফাইল নিম্নলিখিত কোড যোগ করুন:

Object.prototype.clone = 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;
};

এবং সহজভাবে ব্যবহার করুন

var arr1 = ['val_1','val_2','val_3'];
var arr2 = arr1.clone()

এটা কাজ করবে।


এখানে একটি বৈকল্পিক:

var arr1=['a', 'b', 'c'];
var arr2=eval(arr1.toSource());
arr2.push('d');
console.log('arr1: '+arr1+'\narr2: '+arr2);
/*
 *  arr1: a,b,c
 *  arr2: a,b,c,d
 */

এটা ব্যবহার কর:

var newArray = oldArray.slice();

মূলত, slice() ক্রিয়াকলাপ অ্যারে ক্লোন করে এবং একটি নতুন অ্যারের একটি রেফারেন্স প্রদান করে। এছাড়াও নোট করুন যে:

রেফারেন্সের জন্য, স্ট্রিং এবং সংখ্যা (এবং প্রকৃত বস্তু নয়), slice() কপিগুলি নতুন অ্যারেতে রেফারেন্সগুলি অবজেক্ট করে। মূল এবং নতুন অ্যারের উভয় একই বস্তুর উল্লেখ। যদি একটি রেফারেন্সযুক্ত বস্তু পরিবর্তিত হয়, তবে পরিবর্তনগুলি নতুন এবং মূল অ্যারে উভয়ই দৃশ্যমান।

স্ট্রিং এবং সংখ্যার মতো Primitives অপরিবর্তনীয়, তাই স্ট্রিং বা সংখ্যা পরিবর্তনগুলি অসম্ভব।


জাভাস্ক্রিপ্টে, গভীর অনুলিপি কৌশল একটি অ্যারে উপাদান উপর নির্ভর করে।
চল শুরু করি।

উপাদান তিন ধরনের

উপাদান হতে পারে: আক্ষরিক মান, আক্ষরিক কাঠামো, বা প্রোটোটাইপ।

// Literal values (type1)
const booleanLiteral = true;
const numberLiteral = 1;
const stringLiteral = 'true';

// Literal structures (type2)
const arrayLiteral = [];
const objectLiteral = {};

// Prototypes (type3)
const booleanPrototype = new Bool(true);
const numberPrototype = new Number(1);
const stringPrototype = new String('true');
const arrayPrototype = new Array();
const objectPrototype = new Object(); # or "new function () {}"

এই উপাদান থেকে আমরা তিন ধরনের অ্যারে তৈরি করতে পারেন।

// 1) Array of literal-values (boolean, number, string) 
const type1 = [true, 1, "true"];

// 2) Array of literal-structures (array, object)
const type2 = [[], {}];

// 3) Array of prototype-objects (function)
const type3 = [function () {}, function () {}];

গভীর অনুলিপি কৌশল তিনটি অ্যারে ধরনের উপর নির্ভর করে

অ্যারের উপাদানগুলির উপর ভিত্তি করে, আমরা গভীর অনুলিপি বিভিন্ন কৌশল ব্যবহার করতে পারেন।

  • আক্ষরিক মূল্যের অ্যারে (টাইপ 1)
    [...myArray] , myArray.splice(0) , myArray.slice() , এবং myArray.concat() কৌশলগুলি myArray.concat() অ্যারেগুলিকে আক্ষরিক মান (বুলিয়ান, সংখ্যা এবং স্ট্রিং) দিয়ে ব্যবহার করতে পারে; যেখানে স্প্রেড অপারেটর [...myArray] ভাল পারফরম্যান্স করেছে ( https://measurethat.net/Benchmarks/Show/4281/0/spread-array-performance-vs-slice-splice-concat স্প্রেড [...myArray] )।

  • আক্ষরিক-মানগুলির অ্যারে (টাইপ 1) এবং আক্ষরিক কাঠামো (টাইপ 2)
    JSON.parse(JSON.stringify(myArray)) কৌশলটি গভীরভাবে অনুলিপি মানের (বুলিয়ান, সংখ্যা, স্ট্রিং) এবং আক্ষরিক কাঠামো (অ্যারে, বস্তু), কিন্তু প্রোটোটাইপ বস্তুগুলির জন্য অনুলিপি করতে ব্যবহার করা যেতে পারে।

  • সমস্ত অ্যারে (টাইপ 1, টাইপ 2, টাইপ 3)
    JQuery $.extend(myArray) কৌশলটি সমস্ত অ্যারে-ধরণের গভীর-অনুলিপি করতে ব্যবহার করা যেতে পারে। আন্ডারস্কোর এবং লো-ড্যাশের মতো লাইব্রেরিগুলি jQuery $.extend() সমান গভীর অনুলিপি ফাংশন অফার করে $.extend() , এখনও কম কর্মক্ষমতা রয়েছে। আরো বিস্ময়করভাবে, $.extend() এর JSON.parse(JSON.stringify(myArray)) প্রযুক্তিটি http://jsperf.com/js-deep-copy/15 JSON.parse(JSON.stringify(myArray)) চেয়ে বেশি কার্যকারিতা রয়েছে।
    এবং যারা ডেভেলপাররা তৃতীয় পক্ষের লাইব্রেরিগুলি (যেমন jQuery) থেকে দূরে সরে, আপনি নিম্নলিখিত কাস্টম ফাংশন ব্যবহার করতে পারেন; যা $ এর চেয়ে উচ্চতর পারফরম্যান্স রয়েছে .extend, এবং সমস্ত অ্যারে গভীর কপি করে।

function copy(aObject) {
  if (!aObject) {
    return aObject;
  }

  let v;
  let bObject = Array.isArray(aObject) ? [] : {};
  for (const k in aObject) {
    v = aObject[k];
    bObject[k] = (typeof v === "object") ? copy(v) : v;
  }

  return bObject;
}

তাই প্রশ্নের উত্তর দিতে ...

প্রশ্ন

var arr1 = ['a','b','c'];
var arr2 = arr1;

আমি বুঝতে পেরেছি যে AR2 একটি নতুন, স্বাধীন অ্যারের পরিবর্তে অ্যার 1 হিসাবে একই অ্যারে বোঝায়। আমি কিভাবে দুটি স্বাধীন অ্যারে পেতে অ্যারের অনুলিপি করতে পারি?

উত্তর

কারণ arr1 আক্ষরিক মানগুলির একটি arr1 (বুলিয়ান, সংখ্যা, বা স্ট্রিং), আপনি উপরে আলোচনা করা কোনও গভীর অনুলিপি কৌশল ব্যবহার করতে পারেন, যেখানে স্প্রেড অপারেটর ... সর্বোচ্চ কার্যক্ষমতা রয়েছে।

// Highest performance for deep copying literal values
arr2 = [...arr1];

// Any of these techniques will deep copy literal values as well,
//   but with lower performance.
arr2 = arr1.slice();
arr2 = arr1.splice(0);
arr2 = arr1.concat();
arr2 = JSON.parse(JSON.stringify(arr1));
arr2 = $.extend(true, [], arr1); // jQuery.js needed
arr2 = _.extend(arr1); // Underscore.js needed
arr2 = _.cloneDeep(arr1); // Lo-dash.js needed
arr2 = copy(arr1); // Custom-function needed - as provided above

ড্যান, অভিনব কৌশল ব্যবহার করার কোন প্রয়োজন নেই। আপনাকে যা করতে হবে তা করার মাধ্যমে এটির 1 টি অনুলিপি তৈরি করুন।

var arr2 = new Array(arr1);

এখন arr1 এবং arr1 পৃথক স্ট্যাকের মধ্যে সংরক্ষিত দুটি ভিন্ন অ্যারের ভেরিয়েবল হয়। Jsfiddle এই চেক আউট


বহুমাত্রিক অ্যারের / বস্তুর অনুলিপি তৈরি করুন:

function deepCopy(obj) {
   if (Object.prototype.toString.call(obj) === '[object Array]') {
      var out = [], i = 0, len = obj.length;
      for ( ; i < len; i++ ) {
         out[i] = arguments.callee(obj[i]);
      }
      return out;
   }
   if (typeof obj === 'object') {
      var out = {}, i;
      for ( i in obj ) {
         out[i] = arguments.callee(obj[i]);
      }
      return out;
   }
   return obj;
}

এই ফাংশন জন্য জেমস Padolsey ধন্যবাদ।

উত্স: Here


যখন আমরা অ্যাসাইনমেন্ট অপারেটর ( = ) ব্যবহার করে একটি অ্যারের অনুলিপি করতে চাই তখন এটি একটি অনুলিপি তৈরি করে না যা কেবল অ্যারের পয়েন্টার / রেফারেন্স কপি করে। উদাহরণ স্বরূপ:

const oldArr = [1,2,3];

const newArr = oldArr;  // now oldArr points to the same place in memory 

console.log(oldArr === newArr);  // Points to the same place in memory thus is true

const copy = [1,2,3];

console.log(copy === newArr);  // Doesn't point to the same place in memory and thus is false

প্রায়ই যখন আমরা ডেটা রূপান্তর করি তখন আমরা আমাদের প্রাথমিক ডেটা কাঠামো (যেমন অ্যারে) অক্ষত রাখতে চাই। আমরা আমাদের অ্যারের সঠিক কপি করে এটি করি যাতে প্রাথমিক একটি অক্ষত থাকে তবে এটির রূপান্তর করা যায়।

একটি অ্যারের অনুলিপি করার উপায়:

const oldArr = [1,2,3];

// Uses the spread operator to spread out old values into the new array literal
const newArr1 = [...oldArr];

// Slice with no arguments returns the newly copied Array
const newArr2 = oldArr.slice();

// Map applies the callback to every element in the array and returns a new array
const newArr3 = oldArr.map((el) => el);

// Concat is used to merge arrays and returns a new array. Concat with no args copies an array
const newArr4 = oldArr.concat();

// Object.assign can be used to transfer all the properties into a new array literal
const newArr5 = Object.assign([], oldArr);

// Creating via the Array constructor using the new keyword
const newArr6 = new Array(...oldArr);

// For loop
function clone(base) {
	const newArray = [];
    for(let i= 0; i < base.length; i++) {
	    newArray[i] = base[i];
	}
	return newArray;
}

const newArr7 = clone(oldArr);

console.log(newArr1, newArr2, newArr3, newArr4, newArr5, newArr6, newArr7);

অ্যারে বা বস্তু নিস্তেজ হয় যখন সতর্কতা অবলম্বন করা !:

অ্যারে nested হয় যখন মান রেফারেন্স দ্বারা অনুলিপি করা হয়। এখানে কীভাবে সমস্যা হতে পারে তা উদাহরণস্বরূপ:

let arr1 = [1,2,[1,2,3]]

let arr2 = [...arr1];

arr2[2][0] = 5;  // we change arr2

console.log(arr1);  // arr1 is also changed because the array inside arr1 was copied by reference

তাই যখন আপনার অ্যারের ভিতরে বস্তু বা অ্যারে আপনি অনুলিপি করতে চান এই পদ্ধতি ব্যবহার করবেন না। অর্থাৎ শুধুমাত্র primitives অ্যারে এই পদ্ধতি ব্যবহার করুন।

আপনি যদি JSON.parse এর সাথে যুক্ত একটি জাভাস্ক্রিপ্ট অ্যারে JSON.parse ব্যবহার করতে চান তবে এটি পছন্দ করুন:

let arr1 = [1,2,[1,2,3]]

let arr2 = JSON.parse(JSON.stringify(arr1)) ;

arr2[2][0] = 5;

console.log(arr1);  // now I'm not modified because I'm a deep clone

অনুলিপি সঞ্চালন:

সুতরাং আমরা কোনটি সর্বোত্তম কর্মক্ষমতা জন্য চয়ন করবেন না। এটি সক্রিয় করে যে সর্বাধিক verbose পদ্ধতি, for লুপ সর্বোচ্চ কর্মক্ষমতা আছে। সত্যিই CPU সন্নিবেশ অনুলিপি (বড় / অনেক অ্যারে) for লুপ জন্য ব্যবহার করুন।

তারপরে .slice() পদ্ধতিটিরও ভাল পারফরম্যান্স রয়েছে এবং প্রোগ্রামারটির বাস্তবায়নের জন্য এটি কম শব্দের এবং সহজ। আমি আপনার প্রতিদিনের কপি করার জন্য .slice() ব্যবহার করার পরামর্শ দিই যা খুব CPU .slice() নয়। কোন গভীর ক্লোন প্রয়োজন এবং কর্মক্ষমতা একটি সমস্যা যদি JSON.parse(JSON.stringify(arr)) ওভারহেড) ব্যবহার করে JSON.parse(JSON.stringify(arr))

উত্স কর্মক্ষমতা পরীক্ষা


যদি আপনি কোন বস্তুর বা অ্যারের একটি নতুন অনুলিপি তৈরি করতে চান তবে আপনাকে অবশ্যই বস্তুর বৈশিষ্ট্যগুলি বা অ্যারের উপাদানগুলি অনুলিপি করতে হবে, উদাহরণস্বরূপ:

var arr1 = ['a','b','c'];
var arr2 = [];

for (var i=0; i < arr1.length; i++) {
   arr2[i] = arr1[i];
}

আপনি অনুরুপ আদিম মান এবং পরিবর্তনযোগ্য বস্তুর উল্লেখ সম্পর্কে Google এ আরও তথ্যের জন্য অনুসন্ধান করতে পারেন।



slice() একটি বিকল্প concat , যা 2 উপায়ে ব্যবহার করা যেতে পারে। এগুলির মধ্যে প্রথমটি সম্ভবত আরও পঠনযোগ্য হিসাবে অভিপ্রেত আচরণ খুব স্পষ্ট:

var array2 = [].concat(array1);

দ্বিতীয় পদ্ধতি হল:

var array2 = array1.concat();

কোহেন (মন্তব্যসমূহে) এই পরের পদ্ধতির ভাল পারফরমেন্স আছে নির্দেশ করে।

এই কাজটি যেভাবে কাজ করে তা হল concat পদ্ধতিটি একটি নতুন অ্যারে তৈরি করে যা বস্তুটির উপাদান যা এটি বলা হয় যার দ্বারা এটি কোনও অ্যারের উপাদানগুলিকে আর্গুমেন্ট হিসাবে পাস করে অনুসরণ করে। সুতরাং যখন কোন আর্গুমেন্ট পাস করা হয়, এটি কেবল অ্যারের অনুলিপি করে।

লি Penkman, এছাড়াও মন্তব্য, নির্দেশ করে যে যদি একটি সুযোগ অ্যারে 1 undefined , আপনি নিম্নরূপ একটি খালি অ্যারে ফিরে আসতে পারেন:

var array2 = [].concat(array1 || []);

অথবা, দ্বিতীয় পদ্ধতির জন্য:

var array2 = (array1 || []).concat();

নোট করুন যে আপনি এটিও var array2 = (array1 || []).slice(); দিয়ে করতে পারেন: var array2 = (array1 || []).slice();


Array.slice () এর সমাধান যোগ করা হচ্ছে ; সচেতন থাকুন যে যদি আপনার বহুমাত্রিক অ্যারে সাব-অ্যারে থাকে তবে রেফারেন্স দ্বারা অনুলিপি করা হবে। আপনি কি করতে পারেন লুপ এবং স্লাইস () প্রতিটি উপ-অ্যারে পৃথকভাবে

var arr = [[1,1,1],[2,2,2],[3,3,3]];
var arr2 = arr.slice();

arr2[0][1] = 55;
console.log(arr2[0][1]);
console.log(arr[0][1]);

function arrCpy(arrSrc, arrDis){
 for(elm in arrSrc){
  arrDis.push(arrSrc[elm].slice());
}
}

var arr3=[];
arrCpy(arr,arr3);

arr3[1][1] = 77;

console.log(arr3[1][1]);
console.log(arr[1][1]);

একই জিনিস বস্তুর অ্যারে যায়, তারা রেফারেন্স দ্বারা অনুলিপি করা হবে, আপনি তাদের কপি করতে হবে


দ্রুত উদাহরণ:

  1. অ্যারে উপাদান যদি আদিম ধরনের (স্ট্রিং, সংখ্যা, ইত্যাদি)

var arr1 = ['a','b','c'];
// arr1 and arr2 are independent and primitive elements are stored in 
// different places in the memory
var arr2 = arr1.slice(); 
arr2.push('d');
console.log(arr1); // [ 'a', 'b', 'c' ]
console.log(arr2); // [ 'a', 'b', 'c', 'd' ]

  1. অ্যারের উপাদান বস্তু আক্ষরিক হয়, অন্য অ্যারে ({}, [])

var arr1 = [{ x: 'a', y: 'b'}, [1, 2], [3, 4]];
// arr1 and arr2 are independent and reference's/addresses are stored in different
// places in the memory. But those reference's/addresses points to some common place
// in the memory.
var arr2 = arr1.slice(); 
arr2.pop();      // OK - don't affect arr1 bcos only the address in the arr2 is
                 // deleted not the data pointed by that address
arr2[0].x = 'z'; // not OK - affect arr1 bcos changes made in the common area 
                 // pointed by the addresses in both arr1 and arr2
arr2[1][0] = 9;	 // not OK - same above reason

console.log(arr1); // [ { x: 'z', y: 'b' }, [ 9, 2 ], [ 3, 4 ] ]
console.log(arr2); // [ { x: 'z', y: 'b' }, [ 9, 2 ] ]

  1. সমাধান 2 : উপাদান দ্বারা উপাদান দ্বারা গভীর কপি

var arr1 = [{ x: 'a', y: 'b'}, [1, 2], [3, 4]];
arr2 = JSON.parse(JSON.stringify(arr1));
arr2.pop();	  // OK - don't affect arr1
arr2[0].x = 'z';  // OK - don't affect arr1
arr2[1][0] = 9;	  // OK - don't affect arr1

console.log(arr1); // [ { x: 'a', y: 'b' }, [ 1, 2 ], [ 3, 4 ] ]
console.log(arr2); // [ { x: 'z', y: 'b' }, [ 9, 2 ] ]


let a = [1,2,3];

অ্যারের একটি অনুলিপি তৈরি করতে এখন আপনি যেকোনো একটি করতে পারেন।

let b = Array.from(a); 

অথবা

let b = new Array(...a); 

অথবা

let b = a.slice(); 

অথবা

let b = a.map(e => e);

এখন, যদি আমি একটি পরিবর্তন,

a.push(5); 

তারপর, একটি [1,2,3,5] কিন্তু b এখনও [1,2,3] কারণ এতে পার্থক্য রয়েছে।

কিন্তু আমি মনে করি, Here উপরের সমস্ত পদ্ধতিতে ভাল এবং প্রধানত একটি অ্যারের অনুলিপি করা হয়েছে।





arrays