जावास्क्रिप्ट में दो चर कैसे स्वैप करें


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
@Kay: यह तीसरे चर के बजाय एक सरणी का उपयोग करते हुए बहुत धीमा प्रतीत होता है: http://jsperf.com/swap-array-vs-variable मैंने केवल Chrome में इसका परीक्षण किया था। मैं अभी तक ECMAScript 6 संस्करण का परीक्षण करने में सक्षम नहीं था क्योंकि यह वर्तमान में एक Invalid left-hand side in assignment त्रुटि देता है ।
नोप

2
@ फ्रांस्वा वाहल गुड पॉइंट। मुझे लगता है कि यहां अधिकांश उत्तर काम करेंगे और काफी समकक्ष हैं। मुझे लगता है कि यह अस्थायी चर उपयोग, कोड की मात्रा और गति के बीच का व्यापार है।
शोदेव

3
@ फ़्राँस्वा वॉहाल अच्छी तरह से, मैंने अनुमान नहीं लगाया होगा कि यह समाधान इतना धीमा था। इन्हें भी देखें: jsperf.com/swap-array-vs-variable/3
kay - SE बुराई है

3
@showdev टेड हॉप के जवाब में दीजकस्ट्रा उद्धरण पढ़ें।
ब्रायन मैकचूचेन

185

ES6 (फ़ायरफ़ॉक्स और क्रोम पहले से ही इसका समर्थन करते हैं (विनाशकारी एरियर मिलान से)):

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


2
किसी को भी es6 में इस तरह के स्वैप का नाम पता है?
डेरेक

6
@ डेरेक - मुझे लगता है कि इसे सरणी मिलान , विनाशकारी असाइनमेंट का एक रूप कहा जाता है ।
टेड होप

4
यह नोडजेज 7.4.0 / win7 64 पर तीसरे चर विधि की तुलना में लगभग 35 गुना धीमा प्रतीत होता है। लेकिन यह सुनिश्चित है कि यह साफ है।
मिक

नाम के लिए धन्यवाद। developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
ऋतिक

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;

पठनीयता और स्थिरता के लिए, इसे (कम से कम जावास्क्रिप्ट में) हराया नहीं जा सकता। कोड को बनाए रखने वाला कोई भी (अब से छह महीने सहित) आपको पता होगा कि वास्तव में क्या चल रहा है।

चूंकि ये पूर्णांक हैं, आप तीसरे चर का उपयोग किए बिना किसी भी संख्या में चतुर चाल 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 "सक्षम प्रोग्रामर को अपनी खोपड़ी के सीमित आकार के बारे में पूरी तरह से पता है। इसलिए वह पूरी विनम्रता के साथ अपने कार्य के लिए संपर्क करता है, और प्लेग जैसी चतुर चाल से बचता है।" - एग्जर डब्ल्यू


Xor किसी भी डेटा प्रकार के साथ काम करेगा। यह घटाव चाल है जो केवल संख्याओं के साथ काम करेगा।
रोब ग्रांट

11
@RobertGrant - जावास्क्रिप्ट में xor ऑपरेटर अपने ऑपरेंड को 32-बिट पूर्णांक ( ToInt32आंतरिक विधि का उपयोग करके - ईसीएमएस्क्रिप्ट मानक की धारा 11.10 देखें ) में परिवर्तित करता है । यह गैर-पूर्णांक संख्यात्मक मानों के लिए सही परिणाम नहीं देता है। यह गैर-संख्यात्मक मानों को 32-बिट पूर्णांक में भी परिवर्तित करता है। यदि आप के साथ शुरू करते हैं a = "hi"और b = "there", आप के साथ समाप्त होता है a == 0और b == 0
टेड होप

1
यह तरकीब किसी भी प्रकार के डेटा के साथ काम करती है, बशर्ते आपको किसी पूर्णांक परिणाम पर कोई आपत्ति न हो; मान int32s के लिए ऑटो-कास्ट हैं। इसका अर्थ है कि यह संख्यात्मक तार, बूलियन्स (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पुराने मूल्य के लिए नए की स्थापना का प्रभाव है a, जबकि उपज है 0
रुबेन वेरबॉर्ग

6
क्या मैं यह सोचने में सही हूं कि यह केवल संख्यात्मक मूल्य के लिए काम करता है? आप इसे उदाहरण के लिए var a = "hello" b = "world" के साथ a = "world0" के रूप में उपयोग नहीं कर सकते।
क्रिस GW ग्रीन

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;

जैसा कि @Kay ने उल्लेख किया है, यह वास्तव में सरणी तरीका (लगभग 2x जितना तेज़) से बेहतर प्रदर्शन करता है


1
मेरे आदर्श उत्तर की तरह, बस मैं स्वैप करते समय वैरिएबल ए और बी को पुनर्निर्धारित नहीं करना पसंद करता हूं, और स्पष्ट चर नाम "tmp" का उपयोग करता हूं। जैसे 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

आप एक अस्थायी स्वैप चर या XOR का उपयोग कर सकते हैं।

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

यह सिर्फ एक मूल तार्किक अवधारणा है और हर भाषा में काम करता है जो XOR ऑपरेशन का समर्थन करता है।

संपादित करें: टिप्पणियाँ देखें। यह बताना भूल गया कि यह केवल पूर्णांक के साथ काम करता है। प्रश्न के थ्रेड से पूर्णांक चर मान लिया


16
प्रोग्रामिंग साक्षात्कार और अन्य सामान्य सामान्य ज्ञान मामलों के लिए काम करता है। ध्यान दें, हालांकि, वास्तविक जीवन में मूल्यों को स्वैप करने के लिए यह एक बेवकूफ तरीका है। एक बात के लिए, JS में, यह केवल पूर्णांकों के साथ काम करता है।
cHao

1
@Kay आपका क्या मतलब है "पिछले 30 सालों से असली चीज़ नहीं?" जब भी समझ में आता है, मैं बिटवाइज़ ऑपरेटरों का उपयोग करता हूं, जो वास्तव में अक्सर होता है (उदाहरण के लिए, एक अज्ञात बूलियन को भीख देना)
बेन हेरोल्ड

1
@cHao बिटवाइज़ ऑपरेटर मेरी मशीन पर लगातार (और अब तक) सबसे तेज है: jsperf.com/swap-array-vs-variable/2
बेन हेरोल्ड

3
@php_surgeon मैंने फ़ेल्ड को थोड़ा बदल दिया ताकि कंपाइलर चर को मृत के रूप में चिह्नित न कर सके। jsperf.com/swap-array-vs-variable/3 । अस्थायी संस्करण समाधान xor स्वैप समाधान की तुलना में अब 1/4 तेज़ है
kay - SE बुराई है

1
@Kay उन स्थितियों में जहां कुछ स्थिर, अच्छी तरह से टिप्पणी की जाती है, सबसे तेज़ तकनीक है, और केवल एक या दो स्थानों पर उपयोग किया जाता है, मैं यह नहीं देखता कि यह उत्पादन कोड में ठीक क्यों नहीं होगा। सामान्य तौर पर बिटवाइज़ ऑप्स एक कठिन अवधारणा है, इसलिए यदि कोड पहले से ही उनमें से एक गुच्छा का उपयोग करता है, तो रखवाले को वैसे भी उनसे परिचित होने की आवश्यकता होगी। अधिकांश मामलों के लिए, यह स्पष्ट रूप से ओवरकिल है। मुझे लगता है कि कंबल बयान हमेशा मददगार नहीं होते हैं; सब कुछ एक जगह है, यहां तक ​​कि "गोटो" और "ईवैल"।
बीजर


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
@ DmiN के उत्तर के समान दोष।
- एसई बुराई है

जहाँ आप दोष पाते हैं? यह सम्माननीय नहीं है
अब्देनौर टुमी

2
@AbdennourToumi मुझे लगता है कि Kay इस तथ्य का उल्लेख कर रहा है कि आपका उत्तर केवल पूर्णांकों के साथ काम करता है।
शोदेव

1
@ शशदेव: कृपया फिर से प्रश्न पढ़ें: "केवल यह चर, कोई वस्तु नहीं" .... मेरा उत्तर प्रश्न के रूप में अनमोल है। मैं आपसे टिप्पणी करने के लिए कहता हूं। मैं दोहराता हूं: यह सम्मानजनक नहीं है।
अब्देनूर टुमी

1
यह बातचीत विचित्र है। @AbdennourTOUMI - चर पूर्णांक के समान नहीं हैं। आपके पास चर हो सकते हैं जो ऑब्जेक्ट, स्ट्रिंग्स, फ़ंक्शंस, नल, आदि की ओर इशारा करते हैं
रोब ग्रांट


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,_);
Mageek

अंडरस्कोर का क्या _मतलब है? इसे घोषणा की आवश्यकता क्यों नहीं है?
दिन

अंडरस्कोर सिर्फ वैश्विक चर नाम है, आप इसे किसी भी वैध के साथ बदल सकते हैं। जैसे a = (justsomething = b, b = a, justsomething)
Teemu Ikonen

6
अरे नहीं, अघोषित जादू-ग्लोबल वर्जन का इस्तेमाल नहीं करते! यह वास्तविक जीवन में भयानक कीड़े का एक निश्चित तरीका है।
oriadam

यदि कोई अंडरस्कोर का उपयोग करता है तो वह बहुत दुखी होने वाला है, यदि वह दूसरा प्रयास करता है।
टेड होप

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
@RubenVerborgh हाँ लेकिन तर्कों के साथ हम एक तीसरे चर को परिभाषित नहीं कर रहे हैं!
चेर्निव

1
तकनीकी रूप से, argumentsसूची भी एक परिवर्तनशील होगी।
रूबेन वेरबॉघ

1
ठीक है, आप आवंटित aकरने के लिए arguments[0]एक पैरामीटर के रूप में यह पारित करके।
रूबेन वेरबॉघ

1
@RubenVerborgh हाँ, लेकिन आप इसे नहीं बना रहे हैं 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 स्वैप करने में सक्षम हैं:

var val1 =  117,
    val2 = 327;

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



1

यह बहुत सरल है, ES6 ऐरे डिस्ट्रक्टिंग सिंटैक्स का उपयोग करें जो कि [y, x] = [x, y] अधिक जानकारी के लिए इस लिंक से परामर्श करें


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; लेकिन destructuring के बाद, xहै y, यानी 2, और yहै xयानी, 1


1

बिटवाइज़ का उपयोग करके स्वैप करें

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

सिंगल लाइन स्वैप "एरे का उपयोग"

[a, b] = [b, a]

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.