কীভাবে জাভাস্ক্রিপ্টে দুটি ভেরিয়েবল অদলবদল করতে হয়


171

আমার এই দুটি ভেরিয়েবল রয়েছে:

var a = 1,
    b = 2;

আমার প্রশ্ন এগুলি অদলবদল করবেন কীভাবে? কেবল এই ভেরিয়েবলগুলি, কোনও বস্তু নয়।


উত্তর:


321

দুটি ভেরিয়েবলের মানগুলি অদলবদল করতে এখানে একটি ওয়ান-লাইনার রয়েছে।
প্রদত্ত ভেরিয়েবল aএবং b:

b = [a, a = b][0];

নীচে বিক্ষোভ:

var a=1,
    b=2,
    output=document.getElementById('output');

output.innerHTML="<p>Original: "+a+", "+b+"</p>";

b = [a, a = b][0];

output.innerHTML+="<p>Swapped: "+a+", "+b+"</p>";
<div id="output"></div>


264
+1 টি। কিন্তু সবচেয়ে কম সংস্করণ নাম ECMAScript 6 হবে: [a, b] = [b, a];
dfsq

8
@ কে: এটি তৃতীয় ভেরিয়েবলের পরিবর্তে অ্যারে ব্যবহার করে আরও ধীর বলে মনে হচ্ছে: http://jsperf.com/swap-array-vs-variable আমি কেবল Chrome এ এটি পরীক্ষা করেছি। আমি বর্তমানে ইসমাস্ক্রিপ্ট 6 সংস্করণ পরীক্ষা করতে সক্ষম হইনি কারণ এটি বর্তমানে একটি Invalid left-hand side in assignment ত্রুটি দেয় ।
না,

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

3
@ ফ্রানয়েসওহল ভাল, আমি অনুমান করতে পারি না যে এই সমাধানটি এতটা ধীর ছিল। আরও দেখুন: jsperf.com/swap-array-vs-variable/3
কে - এসই খারাপ

3
@ শোদেব টেড হপ্পের উত্তরে ডিজকস্ট্রা উদ্ধৃতিটি পড়ুন।
ব্রায়ান ম্যাকচ্যাটন

185

ES6 (ফায়ারফক্স এবং ক্রোম ইতিমধ্যে এটি সমর্থন করে (নির্ধারিত অ্যাসাইনমেন্ট অ্যারে ম্যাচিং)):

let a = 5, b = 6;
[a, b] = [b, a];
console.log(`${a} ${b}`);


2
এসআই-এ এই জাতীয় স্বাপের নাম কি কেউ জানেন?
ডেরেক

6
@derek - আমার মনে হয় এটা বলা হচ্ছে অ্যারের ম্যাচিং , একটি ফর্ম ডেসট্রাকচারিং অ্যাসাইনমেন্ট
টেড হপ্প

4
এটি নোডেজ .4.৪.০ / উইন 64৪ এ তৃতীয় পরিবর্তনশীল পদ্ধতির চেয়ে প্রায় 35 গুণ ধীর বলে মনে হচ্ছে But তবে এটি নিশ্চিত যে পরিষ্কার।
এমকি 21

নামের জন্য ধন্যবাদ। বিকাশকারী.মোজিলা.আর.ইন
ডকস

5
V8 সংস্করণ 6.8 যেহেতু অ্যারে ডিস্ট্রাকচারিংয়ের সাথে ভেরিয়েবলের অদলবদল অস্থায়ী ভেরিয়েবল ( v8project.blogspot.com/2018/06/v8-release-68.html ) এর মতো দ্রুত হওয়া উচিত ।
রুবেন ভেরবার্গ

120

তুমি এটি করতে পারো:

var a = 1,
    b = 2,
    tmp;
tmp = a;
a = b;
b = tmp;

পঠনযোগ্যতা এবং রক্ষণাবেক্ষণের জন্য, এটি বীট করা যায় না (কমপক্ষে জাভাস্ক্রিপ্টে)। কোড রক্ষণ করা যে কেউ (এখন থেকে ছয় মাস অন্তর অন্তর্ভুক্ত) ঠিক কী ঘটছে তা জানতে পারবেন know

যেহেতু এই পূর্ণসংখ্যা, এছাড়াও আপনি চালাক ঠাট যে কোন সংখ্যার ব্যবহার করতে পারেন 1 তৃতীয় পরিবর্তনশীল ব্যবহার না করেই swap 'র জন্য। উদাহরণস্বরূপ আপনি বিটওয়াইজ এক্সওর অপারেটরটি ব্যবহার করতে পারেন:

let a = 1, b = 2;
a = a ^ b;
b = a ^ b;
a = a ^ b;
    
console.log('a is now:', a);
console.log('b is now:', b);

একে XOR সোয়াপ অ্যালগরিদম বলা হয়। এর পরিচালনা তত্ত্বটি এই উইকিপিডিয়া নিবন্ধে বর্ণিত হয়েছে ।

1 "দক্ষ প্রোগ্রামার তার নিজের মাথার খুলির সীমিত আকার সম্পর্কে পুরোপুরি সচেতন therefore তাই তিনি সম্পূর্ণ নম্রতার সাথে তাঁর কার্যের দিকে এগিয়ে যান এবং প্লেগের মতো চতুর কৌশলগুলি এড়িয়ে যান" " - এডজার ডাব্লু ডিজকস্ট্রা


Xor যে কোনও ডাটা টাইপের সাথে কাজ করবে। এটি বিয়োগের কৌশলটি কেবল সংখ্যার সাথে কাজ করবে।
রব গ্রান্ট

11
@ রবার্টগ্রান্ট - জাভাস্ক্রিপ্টের জোর অপারেটর তার অপারেশনগুলি 32-বিট পূর্ণ সংখ্যায় রূপান্তর করে ( ToInt32অভ্যন্তরীণ পদ্ধতিটি ব্যবহার করে — ECMAScript স্ট্যান্ডার্ডের ১১.১০ দেখুন )। এটি পূর্ণসংখ্যার সংখ্যাগত মানগুলির জন্য সঠিক ফলাফল দেয় না not এটি অ-সংখ্যাগত মানগুলি 32-বিট পূর্ণসংখ্যায় রূপান্তর করে। আপনার সাথে শুরু করেন a = "hi"এবং b = "there", আপনি দিয়ে শেষ a == 0এবং b == 0
টেড হপ

1
এই কৌশলটি কোনও ডেটা ধরণের সাথে কাজ করে, আপনি যদি কোনও পূর্ণসংখ্যার ফলাফলকে আপত্তি না করেন তবে; মানগুলি int32 এ স্ব-কাস্ট হয়। এর অর্থ এটি সংখ্যার স্ট্রিং, বুলিয়ান (0/1), নাল (0) এবং খালি অ্যারে / অবজেক্টস (0) দিয়ে কাজ করতে পারে। যদিও মূল প্রকারটি সংরক্ষণ করা হয়নি, তাই প্রভাবিত বুলিয়ানরা উদাহরণস্বরূপ typeof a == 'boolean'বা এর সাথে কাজ করবে না a === false। আসল সংখ্যাগুলি কাজ করে, এগুলি বাদে শূন্যের তুলনায় নিকটতম পূর্ণসংখ্যকে গোল করা হয়।
বিউজর

1
@ বিজোর - অন্য কথায়, এটি কোনও ডাটা টাইপের সাথে কাজ করে, এটি না করে (যদি না তারা পূর্ণসংখ্যার মান হয়)। আমার বইতে "অদলবদল" এর অর্থ "প্রতিটি ভেরিয়েবলের মান থাকা অন্যটির সাথে" ইন্টু 32 তে রূপান্তর না করে "পরিবর্তিত হয়ে শেষ হওয়ার সাথে শেষ হয়।
টেড হপ্প

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

58

নীচের কোডটি ব্যবহার করবেন না। দুটি ভেরিয়েবলের মান অদলবদল করার প্রস্তাব দেওয়া উপায় নয় (কেবলমাত্র এটির জন্য অস্থায়ী ভেরিয়েবল ব্যবহার করুন)। এটি কেবল একটি জাভাস্ক্রিপ্ট কৌশল দেখায়।

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

a = b + (b=a, 0)

এটি দুটি ধাপে কাজ করে:

  • (b=a, 0)bপুরানো মান সেট করে aএবং ফলন দেয়0
  • a = b + 0aপুরানো মান সেট করেb

5
টেম্প ভার্সন সংস্করণটি কিছুটা দ্রুত এবং আরও সাধারণ এবং আরও পঠনযোগ্য। jsperf.com/swap-two-numbers-without-tmp-var/9
এন্টিমোনি

এই () সিনট্যাক্সটির অর্থ কী? এটি কিভাবে 0 উপার্জন করে?
পিট অ্যালভিন

8
প্রথম বন্ধনীর অপারেটরটি কমা অপারেটর ,, এবং এটি অগ্রাধিকারটি সঠিকভাবে সেট করতে মোড়ানো হয়েছে। কমা অপারেটর তার উভয় যুক্তি (এই ক্ষেত্রে b=aএবং 0) মূল্যায়ন করে এবং সর্বশেষটি (এই ক্ষেত্রে 0) প্রদান করে। সুতরাং এখানে, এটি ফলন bকরার সময় এর পুরানো মানকে নতুন সেট করার প্রভাব ফেলে । a0
রুবেন ভেরবার্গ

6
আমি কি ভেবে সঠিকভাবে বলছি এটি কেবল সংখ্যাগত মানের জন্য কাজ করে? আপনি এটি উদাহরণস্বরূপ var a = "হ্যালো" বি = "ওয়ার্ল্ড" এর সাথে = "ওয়ার্ল্ড0" হিসাবে ব্যবহার করতে পারবেন না।
ক্রিস জিডব্লু গ্রিন

3
@ ক্রিসজিডব্লিউগ্রিন:a = b + (b=a, "")

19

ES6 যেহেতু, আপনি ভেরিয়েবলগুলি আরও মার্জিতভাবে অদলবদল করতে পারেন:

var a = 1,
    b = 2;

[a, b] = [b, a];

console.log('a:', a, 'b:', b); // a: 2 b: 1

18

এখানে একটি ওয়ান-লাইনার রয়েছে, ধরে নেওয়া aএবং bইতিমধ্যে বিদ্যমান এবং মানগুলি অদলবদলের প্রয়োজন রয়েছে:

var c=a, a=b, b=c;

@ কে যেমন উল্লেখ করেছেন, এটি আসলে অ্যারে পদ্ধতির চেয়ে প্রায় ভাল (প্রায় 2x দ্রুত) পারফর্ম করে


1
আমার আদর্শ উত্তরের মতো, আমি কেবল অদলবদল করার সময় ভেরিয়েবলটি অ্যান্ড বি পুনরায় বর্ণিত করতে পছন্দ করি না এবং স্পষ্টত পরিবর্তনশীল নাম "টিএমপি" ব্যবহার করি। ভালো লেগেছে: var a, b, tmp; a = 1; b = 2; tmp=a, a=b, b=tmp; ব্যক্তিগত স্বাদ.
জনি ওয়াং

10

তৃতীয় ভেরিয়েবল এর মতো ব্যবহার করুন:

var a = 1,
    b = 2,
    c = a;

a = b; // must be first or a and b end up being both 1
b = c;

ডেমো - একটি তৃতীয় ভেরিয়েবল ব্যবহার করে



10

ES6 + পদ্ধতি: ES6 যেহেতু আপনি ভেরিয়েবলগুলি আরও মার্জিতভাবে বদলে নিতে পারেন। আপনি ডেস্ট্রাকচারিং এসাইন ম্যাচ ব্যবহার করতে পারেন। এটা সহজ। var a = 10 b = 20;

[ক, খ] = [খ, ক]

কনসোল.লগ (ক, খ) // 20 10



9

আপনি একটি অস্থায়ী সোয়াপ ভেরিয়েবল বা এক্সওআর ব্যবহার করতে পারেন।

a = a ^ b
b = a ^ b
a = a ^ b

এটি কেবলমাত্র একটি প্রাথমিক যৌক্তিক ধারণা এবং প্রতিটি ভাষায় কাজ করে যা এক্সওআর অপারেশনকে সমর্থন করে।

সম্পাদনা: মন্তব্য দেখুন। এটি কেবল পূর্ণসংখ্যার সাথে নিশ্চিত হয়ে কাজ করে তা বলতে ভুলে গেছেন। প্রশ্নের থ্রেড থেকে পূর্ণসংখ্যার পরিবর্তনগুলি ধরে নিয়েছে


16
প্রোগ্রামিং সাক্ষাত্কার এবং অন্যান্য সাধারণ ট্রিভিয়া ক্ষেত্রে কাজ করে। দ্রষ্টব্য, যদিও, এটি বাস্তব জীবনে মূল্যবোধের অদলবদলের একটি বোকামি উপায়। একটি জিনিসের জন্য, জেএসে, এটি কেবল পূর্ণসংখ্যার সাথে কাজ করে।
সিএইচও

1
@ কে আপনাকে "গত 30 বছরের সত্যিকারের জিনিস নয়" বলতে কী বোঝায়? আমি যখনই বিটওয়াইজ অপারেটরগুলি বোধ করি তখনই এটি ব্যবহার করি যা আসলে প্রায়শই হয় (উদাহরণস্বরূপ একটি অজানা বুলিয়ান টগল করা)
বেন হ্যারল্ড

1
@ সিএইচও বিটওয়াইস অপারেটর আমার মেশিনে ধারাবাহিকভাবে (এবং এখনও পর্যন্ত) দ্রুততম: jsperf.com/swap-array-vs-variable/2
বেন হ্যারল্ড

3
@ পিএইচপি_সার্জন আমি ফিটলটিকে কিছুটা পরিবর্তন করেছি যাতে সংকলকটি ভেরিয়েবলগুলিকে মৃত হিসাবে চিহ্নিত করতে না পারে। jsperf.com/swap-array-vs-variable/3 । টেম্প ভার্সন দ্রবণটি এখন জোর অদলবদল দ্রবণের চেয়ে ১/৪ দ্রুত
কে - এসই খারাপ

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


7

যেহেতু আপনার প্রশ্নটি মূল্যবান ছিল "কেবল এই পরিবর্তনশীল, কোনও বস্তু নয়" ", উত্তরটিও মূল্যবান হবে:

var a = 1, b = 2

a=a+b;
b=a-b;
a=a-b;

এটি একটি কৌশল

এবং রদ্রিগো অ্যাসিস যেমন বলেছিলেন, এটি "খাটো হতে পারে"

 b=a+(a=b)-b;

ডেমো: http://jsfiddle.net/abdennour/2jJQ2/


1
@ ডিএমআইএন এর উত্তর হিসাবে একই ত্রুটি।
কে - এসই খারাপ

আপনি কোথায় ত্রুটি খুঁজে পান? এটি সম্মানজনক নয়
আবদেনর টুমি

2
@ অ্যাডেনডর টউমি আমার ধারণা কে আপনার উত্তরটি কেবল পূর্ণসংখ্যার সাথে কাজ করে এমনটি উল্লেখ করছে।
শোদেব

1
@ শোদেব: দয়া করে আবার প্রশ্নটি পড়ুন: "কেবল এই পরিবর্তনশীল, কোনও বস্তু নয়" .... আমার উত্তরটি প্রশ্ন হিসাবে মূল্যবান। আমি আপনাকে মন্তব্যটি পতাকাঙ্কিত করতে বলছি .আমি পুনরায়: এটি সম্মানজনক নয়।
আবডেন্নর টুমি

1
এই কথোপকথন উদ্ভট। @ অ্যাডডেনর ট্যুমি - ভেরিয়েবলগুলি পূর্ণসংখ্যা হিসাবে একই নয়। আপনার কাছে ভেরিয়েবল থাকতে পারে যা বস্তু, স্ট্রিং, ফাংশন, নাল ইত্যাদির দিকে নির্দেশ করে
রব গ্রান্ট


4

কীভাবে আমরা এই ক্লাসিক অনেলাইনারদের মিস করতে পারি

var a = 1, b = 2
a = ({a:b, _:(b=a)}).a;

এবং

var a = 1, b = 2
a = (_=b,b=a,_);

শেষটি বিশ্বব্যাপী পরিবর্তনশীল '_' প্রকাশ করে তবে সাধারণ জাভাস্ক্রিপ্ট কনভেনশনটি এটি 'ডন্ট কেয়ার' ভেরিয়েবল হিসাবে ব্যবহার করা উচিত নয়।


1
দ্বিতীয়টিতে একটি টাইপো রয়েছে। এটি হওয়া উচিতa = (_=b,b=a,_);
ম্যাজেক

আন্ডারস্কোর _বলতে কী বোঝায়? কেন এটি ঘোষণার দরকার নেই?
দিন

আন্ডারস্কোর হ'ল গ্লোবাল ভেরিয়েবলের নাম, আপনি এটিকে যে কোনও বৈধ সাথে প্রতিস্থাপন করতে পারেন। যেমন এ = (ন্যায়সঙ্গত = বি, বি = এ, ন্যায়সঙ্গত)
টিমু ইকোনেন

6
ওহ না, অঘোষিত যাদু-গ্লোবাল ভার্স ব্যবহার করবেন না! এটি বাস্তব জীবনের ভয়ঙ্কর বাগগুলির একটি নিশ্চিত উপায়।
অরিয়াদাম

আন্ডারস্কোর.জেএস ব্যবহার করা যে কেউ যদি দ্বিতীয়টি চেষ্টা করে তবে খুব অসন্তুষ্ট হতে চলেছে।
টেড হপ

3

আমি এখানে একধরণের প্রোগ্রামিং অলিম্পিয়াড দেখি। আরও একটি জটিল এক-লাইন সমাধান:

b = (function(){ a=b; return arguments[0]; })(a);

ফিডল: http://jsfiddle.net/cherniv/4q226/


2
ধীর ব্যবহার করার দরকার নেই arguments, শুধু করুন b = (function (x){ return x; })(a, a=b)
রুবেন ভার্বার্গ

1
@ রুবেনবার্গ হ্যাঁ তবে যুক্তি দিয়ে আমরা তৃতীয় ভেরিয়েবল সংজ্ঞায়িত করছি না!
চেরেনিভ

1
প্রযুক্তিগতভাবে, argumentsতালিকাটি একটি পরিবর্তনশীলও হবে।
রুবেন ভার্বার্গ

1
হ্যাঁ, আপনি দায়িত্ব অর্পণ aকরার arguments[0]একটি প্যারামিটার যেমন ক্ষণস্থায়ী দ্বারা।
রুবেন ভেরবার্গ

1
@ রুবেনভেরবার্গ হ্যাঁ, তবে আপনি তৈরি করছেন না argumentsএবং এর অ্যাসাইনমেন্টটি "পর্দার আড়ালে" ঘটে
চেরনিভ


3
var a = 5;
var b = 10;

b = [a, a = b][0];
//or
b = [a, a = b];
b = b[0];

//or
b = [a, b];
a = b[1];
b = b[0];


alert("a=" + a + ',' + "b=" + b);

2 // বা এর সরান বা মন্তব্য করুন এবং কোডের একটি সেট দিয়ে চালান

http://jsfiddle.net/USdv8/57/


2

আমরা এইরকম ভেরি অদলবদল করতে সক্ষম:

var val1 =  117,
    val2 = 327;

val2 = val1-val2; 
console.log(val2);
val1 = val1-val2;
console.log(val1);
val2 = val1+val2;
console.log(val2);




1

ES5 অবধি, দুটি সংখ্যার অদলবদল করতে, আপনাকে একটি অস্থায়ী ভেরিয়েবল তৈরি করতে হবে এবং তারপরে এটিকে অদলবদল করতে হবে। তবে ES6 এ, অ্যারের ডিস্ট্রাকচারিং ব্যবহার করে দুটি সংখ্যা অদলবদল করা খুব সহজ। উদাহরণ দেখুন।

let x,y;
[x,y]=[2,3];
console.log(x,y);      // return 2,3

[x,y]=[y,x];
console.log(x,y);      // return 3,2

1

কারণ আমি শুনেছি এই পদ্ধতিটি ধীর গতিতে চলেছে:

b = [a, a = b][0];

যদি আপনি কোনও বস্তুতে (বা অ্যারে) আপনার ওয়ার্স সংরক্ষণের পরিকল্পনা করেন তবে এই ফাংশনটি কাজ করা উচিত:

function swapVars(obj, var1, var2){
    let temp = obj[var1];
    obj[var1] = obj[var2];
    obj[var2] = temp;
}

ব্যবহার:

let test = {a: 'test 1', b: 'test 2'};

console.log(test); //output: {a: 'test 1', b: 'test 2'}

swapVars(test, 'a', 'b');

console.log(test); //output: {a: 'test 2', b: 'test 1'}


1

ES6 অ্যারে ডেস্ট্রাকচারিং দুটি ভেরিয়েবল অদলবদল করতে ব্যবহৃত হয়। উদাহরণ দেখুন

var [x,y]=[1,2];
[x,y]=[y,x];

এর সাথে আরও সহজ উপায়:

x === 1এবং y === 2; কিন্তু ডেসট্রাকচারিং পর xহয় y, অর্থাত্ 2, এবং yহয় xঅর্থাত, 1


1

বিটওয়াস ব্যবহার করে অদলবদল করুন

let a = 10;
let b = 20;
a ^= b;
y ^= a;
a ^= b;

"অ্যারে ব্যবহার করে" একক লাইন অদলবদল

[a, b] = [b, a]

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