जवाबों:
यहां दो वेरिएबल्स के मूल्यों की अदला-बदली करने के लिए एक-लाइनर है।
दिया गया चर 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;
पठनीयता और स्थिरता के लिए, इसे (कम से कम जावास्क्रिप्ट में) हराया नहीं जा सकता। कोड को बनाए रखने वाला कोई भी (अब से छह महीने सहित) आपको पता होगा कि वास्तव में क्या चल रहा है।
चूंकि ये पूर्णांक हैं, आप तीसरे चर का उपयोग किए बिना किसी भी संख्या में चतुर चाल 1 से स्वैप करने के लिए भी उपयोग कर सकते हैं । उदाहरण के लिए आप बिटव्यू एक्सर ऑपरेटर का उपयोग कर सकते हैं:
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 "सक्षम प्रोग्रामर को अपनी खोपड़ी के सीमित आकार के बारे में पूरी तरह से पता है। इसलिए वह पूरी विनम्रता के साथ अपने कार्य के लिए संपर्क करता है, और प्लेग जैसी चतुर चाल से बचता है।" - एग्जर डब्ल्यू
ToInt32
आंतरिक विधि का उपयोग करके - ईसीएमएस्क्रिप्ट मानक की धारा 11.10 देखें ) में परिवर्तित करता है । यह गैर-पूर्णांक संख्यात्मक मानों के लिए सही परिणाम नहीं देता है। यह गैर-संख्यात्मक मानों को 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;
जैसा कि @Kay ने उल्लेख किया है, यह वास्तव में सरणी तरीका (लगभग 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);
आप एक अस्थायी स्वैप चर या XOR का उपयोग कर सकते हैं।
a = a ^ b
b = a ^ b
a = a ^ b
यह सिर्फ एक मूल तार्किक अवधारणा है और हर भाषा में काम करता है जो XOR ऑपरेशन का समर्थन करता है।
संपादित करें: टिप्पणियाँ देखें। यह बताना भूल गया कि यह केवल पूर्णांक के साथ काम करता है। प्रश्न के थ्रेड से पूर्णांक चर मान लिया
आप 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 स्वैप करने में सक्षम हैं:
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]
अधिक जानकारी के लिए इस लिंक से परामर्श करें
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
; लेकिन destructuring के बाद, x
है y
, यानी 2
, और y
है x
यानी, 1
।
बिटवाइज़ का उपयोग करके स्वैप करें
let a = 10;
let b = 20;
a ^= b;
y ^= a;
a ^= b;
सिंगल लाइन स्वैप "एरे का उपयोग"
[a, b] = [b, a]
(function (A, B) {b = A; a = B;}) (parseInt (a), parseInt (b));