উত্তর:
দুটি ভেরিয়েবলের মানগুলি অদলবদল করতে এখানে একটি ওয়ান-লাইনার রয়েছে।
প্রদত্ত ভেরিয়েবল 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>
[a, b] = [b, a];
।
Invalid left-hand side in assignment
ত্রুটি দেয় ।
ES6 (ফায়ারফক্স এবং ক্রোম ইতিমধ্যে এটি সমর্থন করে (নির্ধারিত অ্যাসাইনমেন্ট অ্যারে ম্যাচিং)):
let a = 5, b = 6;
[a, b] = [b, a];
console.log(`${a} ${b}`);
তুমি এটি করতে পারো:
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 তাই তিনি সম্পূর্ণ নম্রতার সাথে তাঁর কার্যের দিকে এগিয়ে যান এবং প্লেগের মতো চতুর কৌশলগুলি এড়িয়ে যান" " - এডজার ডাব্লু ডিজকস্ট্রা
ToInt32
অভ্যন্তরীণ পদ্ধতিটি ব্যবহার করে — ECMAScript স্ট্যান্ডার্ডের ১১.১০ দেখুন )। এটি পূর্ণসংখ্যার সংখ্যাগত মানগুলির জন্য সঠিক ফলাফল দেয় না not এটি অ-সংখ্যাগত মানগুলি 32-বিট পূর্ণসংখ্যায় রূপান্তর করে। আপনার সাথে শুরু করেন a = "hi"
এবং b = "there"
, আপনি দিয়ে শেষ a == 0
এবং b == 0
।
typeof a == 'boolean'
বা এর সাথে কাজ করবে না a === false
। আসল সংখ্যাগুলি কাজ করে, এগুলি বাদে শূন্যের তুলনায় নিকটতম পূর্ণসংখ্যকে গোল করা হয়।
নীচের কোডটি ব্যবহার করবেন না। দুটি ভেরিয়েবলের মান অদলবদল করার প্রস্তাব দেওয়া উপায় নয় (কেবলমাত্র এটির জন্য অস্থায়ী ভেরিয়েবল ব্যবহার করুন)। এটি কেবল একটি জাভাস্ক্রিপ্ট কৌশল দেখায়।
এই সমাধানটিতে কোনও অস্থায়ী পরিবর্তনশীল, কোনও অ্যারে, কেবল একটি সংযোজন নেই এবং এটি দ্রুত । প্রকৃতপক্ষে, এটি বেশ কয়েকটি প্ল্যাটফর্মের মধ্যে অস্থায়ী পরিবর্তনশীলের চেয়েও দ্রুত ।
এটি সমস্ত সংখ্যার জন্য কাজ করে, কখনই ওভারফ্লো হয় না এবং ইনফিনিটি এবং এনএএন এর মতো প্রান্ত-কেসগুলি পরিচালনা করে।
a = b + (b=a, 0)
এটি দুটি ধাপে কাজ করে:
(b=a, 0)
b
পুরানো মান সেট করে a
এবং ফলন দেয়0
a = b + 0
a
পুরানো মান সেট করেb
,
, এবং এটি অগ্রাধিকারটি সঠিকভাবে সেট করতে মোড়ানো হয়েছে। কমা অপারেটর তার উভয় যুক্তি (এই ক্ষেত্রে b=a
এবং 0
) মূল্যায়ন করে এবং সর্বশেষটি (এই ক্ষেত্রে 0
) প্রদান করে। সুতরাং এখানে, এটি ফলন b
করার সময় এর পুরানো মানকে নতুন সেট করার প্রভাব ফেলে । a
0
এখানে একটি ওয়ান-লাইনার রয়েছে, ধরে নেওয়া a
এবং b
ইতিমধ্যে বিদ্যমান এবং মানগুলি অদলবদলের প্রয়োজন রয়েছে:
var c=a, a=b, b=c;
@ কে যেমন উল্লেখ করেছেন, এটি আসলে অ্যারে পদ্ধতির চেয়ে প্রায় ভাল (প্রায় 2x দ্রুত) পারফর্ম করে ।
var a, b, tmp;
a = 1
; b = 2
; tmp=a, a=b, b=tmp;
ব্যক্তিগত স্বাদ.
ES6 + পদ্ধতি: ES6 যেহেতু আপনি ভেরিয়েবলগুলি আরও মার্জিতভাবে বদলে নিতে পারেন। আপনি ডেস্ট্রাকচারিং এসাইন ম্যাচ ব্যবহার করতে পারেন। এটা সহজ। var a = 10 b = 20;
[ক, খ] = [খ, ক]
কনসোল.লগ (ক, খ) // 20 10
আপনি এখন শেষ পর্যন্ত করতে পারেন:
let a = 5;
let b = 10;
[a, b] = [b, a]; // ES6
console.log(a, b);
আপনি একটি অস্থায়ী সোয়াপ ভেরিয়েবল বা এক্সওআর ব্যবহার করতে পারেন।
a = a ^ b
b = a ^ b
a = a ^ b
এটি কেবলমাত্র একটি প্রাথমিক যৌক্তিক ধারণা এবং প্রতিটি ভাষায় কাজ করে যা এক্সওআর অপারেশনকে সমর্থন করে।
সম্পাদনা: মন্তব্য দেখুন। এটি কেবল পূর্ণসংখ্যার সাথে নিশ্চিত হয়ে কাজ করে তা বলতে ভুলে গেছেন। প্রশ্নের থ্রেড থেকে পূর্ণসংখ্যার পরিবর্তনগুলি ধরে নিয়েছে
আপনি ES6 এর মতো ডেস্ট্রাকচারিং অ্যাসাইনমেন্ট ব্যবহার করতে পারেন :
let a = 10;
let b = 20;
[a, b] = [b, a];
console.log(a, b); // a = 20, b = 10
যেহেতু আপনার প্রশ্নটি মূল্যবান ছিল "কেবল এই পরিবর্তনশীল, কোনও বস্তু নয়" ", উত্তরটিও মূল্যবান হবে:
var a = 1, b = 2
a=a+b;
b=a-b;
a=a-b;
এটি একটি কৌশল
এবং রদ্রিগো অ্যাসিস যেমন বলেছিলেন, এটি "খাটো হতে পারে"
b=a+(a=b)-b;
ES6 ধ্বংস:
একটি অ্যারে ব্যবহার: [a, b] = [b, a]; // my favorite
একটি অবজেক্ট ব্যবহার করা: {a, b} = {a:b, b:a}; // not bad neither
কীভাবে আমরা এই ক্লাসিক অনেলাইনারদের মিস করতে পারি
var a = 1, b = 2
a = ({a:b, _:(b=a)}).a;
এবং
var a = 1, b = 2
a = (_=b,b=a,_);
শেষটি বিশ্বব্যাপী পরিবর্তনশীল '_' প্রকাশ করে তবে সাধারণ জাভাস্ক্রিপ্ট কনভেনশনটি এটি 'ডন্ট কেয়ার' ভেরিয়েবল হিসাবে ব্যবহার করা উচিত নয়।
a = (_=b,b=a,_);
_
বলতে কী বোঝায়? কেন এটি ঘোষণার দরকার নেই?
আমি এখানে একধরণের প্রোগ্রামিং অলিম্পিয়াড দেখি। আরও একটি জটিল এক-লাইন সমাধান:
b = (function(){ a=b; return arguments[0]; })(a);
arguments
, শুধু করুন b = (function (x){ return x; })(a, a=b)
।
arguments
তালিকাটি একটি পরিবর্তনশীলও হবে।
a
করার arguments[0]
একটি প্যারামিটার যেমন ক্ষণস্থায়ী দ্বারা।
arguments
এবং এর অ্যাসাইনমেন্টটি "পর্দার আড়ালে" ঘটে
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 // বা এর সরান বা মন্তব্য করুন এবং কোডের একটি সেট দিয়ে চালান
আমরা এইরকম ভেরি অদলবদল করতে সক্ষম:
var val1 = 117,
val2 = 327;
val2 = val1-val2;
console.log(val2);
val1 = val1-val2;
console.log(val1);
val2 = val1+val2;
console.log(val2);
ES6 এ এখন ডেস্ট্রাকচারিং অ্যাসাইনমেন্ট রয়েছে এবং আপনি এটি করতে পারেন:
let a = 1;
let b = 2;
[b, a] = [a, b] // a = 2, b = 1
let a = 2, b = 4;
[b, a] = [a, b];
আরও ভার্জোজ অ্যাপ্রোচ হবে
let a = 2, b = 4;
a = [a, b];
b = a[0];
a = a[1];
এটা খুবই সহজ, ব্যবহার ES6 অ্যারের ডেসট্রাকচারিং সিনট্যাক্স যা [y, x] = [x, y]
আরও তথ্যের জন্য এই লিঙ্কে সঙ্গে পরামর্শ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment
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
কারণ আমি শুনেছি এই পদ্ধতিটি ধীর গতিতে চলেছে:
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'}
আমরা অতিরিক্ত পরামিতি ছাড়াই দুটি মান অদলবদল করতে IIFE ব্যবহার করতে পারি
var a = 5, b =8;
b = (function(a){
return a
}(a, a=b));
document.write("a: " + a+ " b: "+ b);
ES6 অ্যারে ডেস্ট্রাকচারিং দুটি ভেরিয়েবল অদলবদল করতে ব্যবহৃত হয়। উদাহরণ দেখুন
var [x,y]=[1,2];
[x,y]=[y,x];
এর সাথে আরও সহজ উপায়:
x === 1
এবং y === 2
; কিন্তু ডেসট্রাকচারিং পর x
হয় y
, অর্থাত্ 2
, এবং y
হয় x
অর্থাত, 1
।
বিটওয়াস ব্যবহার করে অদলবদল করুন
let a = 10;
let b = 20;
a ^= b;
y ^= a;
a ^= b;
"অ্যারে ব্যবহার করে" একক লাইন অদলবদল
[a, b] = [b, a]
(ফাংশন (এ, বি) {বি = এ; এ = বি;}) (পার্সিয়ান্ট (এ), পার্সিয়ান্ট (খ));