উত্তর:
আপনার কেবলমাত্র একটি অস্থায়ী পরিবর্তনশীল প্রয়োজন।
var b = list[y];
list[y] = list[x];
list[x] = b;
সম্পাদন করাআমাদের বেল্টের নীচে প্রচুর ES6 গ্রহণের সাথে 10 বছর পরে শীর্ষ উত্তরের হাইজ্যাকিং :
অ্যারে দেওয়া arr = [1,2,3,4]
, আপনি এখন এক লাইনে মানগুলি অদলবদল করতে পারেন:
[arr[0], arr[1]] = [arr[1], arr[0]];
এটি অ্যারে উত্পাদন করবে [2,1,3,4]
। এটি হ'ল ডেস্ট্রাকচারিং অ্যাসাইনমেন্ট ।
[ list[y], list[x] ] = [ list[x], list[y] ];
[arr[0], arr[1]] = [arr[1], arr[0]]
কেবলমাত্র [2, 1]
বাকি অ্যারে ছাড়াই উত্পাদন করুন
যদি আপনি নেটিভ জাভাস্ক্রিপ্ট ব্যবহার করে একটি একক অভিব্যক্তি চান, তবে মনে রাখবেন যে একটি স্প্লাইস অপারেশন থেকে ফেরতের মানটিতে সরানো উপাদান (গুলি) রয়েছে।
var A = [1, 2, 3, 4, 5, 6, 7, 8, 9], x= 0, y= 1;
A[x] = A.splice(y, 1, A[x])[0];
alert(A); // alerts "2,1,3,4,5,6,7,8,9"
সম্পাদনা:
[0]
যেমন অভিব্যক্তি শেষে প্রয়োজনীয় Array.splice()
আয় একটি অ্যারের, এবং এই অবস্থায় আমরা ফিরে অ্যারের মধ্যে একক উপাদান প্রয়োজন।
মনে হচ্ছে ঠিক আছে ....
var b = list[y];
list[y] = list[x];
list[x] = b;
হোয়ারভার ব্যবহার করে
var b = list[y];
মানে একটি বি ভেরিয়েবল বাকি সুযোগের জন্য উপস্থিত হতে চলেছে। এটি সম্ভবত মেমরি ফাঁস হতে পারে। অসম্ভব, তবে এড়ানো আরও ভাল।
এটিকে অ্যারে.প্রোটোটাইপ.সোপাতে রাখার জন্য একটি ভাল ধারণা
Array.prototype.swap = function (x,y) {
var b = this[x];
this[x] = this[y];
this[y] = b;
return this;
}
যাকে বলা যেতে পারে:
list.swap( x, y )
এই উভয় একটি পরিষ্কার পন্থা এড়ানো মেমরি তথ্য ফাঁসের এবং শুকনো ।
Array.prototype.swap = function (x,y) { if (x >= 0 && x < this.length && y >= 0 && y < this.length) { var b = this[x]; this[x] = this[y]; this[y] = b; } return this; };
মেটাফিল্টারের কিছু এলোমেলো ব্যক্তির মতে , "জাভাস্ক্রিপ্টের সাম্প্রতিক সংস্করণগুলি আপনাকে আরও ঝরঝরে করে (অন্যান্য জিনিসের মধ্যে) অদলবদল করতে দেয়:"
[ list[x], list[y] ] = [ list[y], list[x] ];
আমার দ্রুত পরীক্ষাগুলি দেখিয়েছে যে এই পাইথোনিক কোডটি বর্তমানে "গুগল অ্যাপস স্ক্রিপ্ট" (".gs") তে ব্যবহৃত জাভাস্ক্রিপ্ট সংস্করণে দুর্দান্ত কাজ করে। হায়রে, আরও পরীক্ষাগুলি দেখায় যে এই কোডটি একটি "অব্যক্ত রেফারেন্স এরিয়ার: অ্যাসাইনমেন্টে অবৈধ বাম-হাত" " জাভাস্ক্রিপ্টের যে কোনও সংস্করণে (".js") গুগল ক্রোম সংস্করণ 24.0.1312.57 মি ব্যবহার করে।
ঠিক আছে, আপনার উভয় মান বাফার করার দরকার নেই - কেবলমাত্র একটি:
var tmp = list[x];
list[x] = list[y];
list[y] = tmp;
আপনি নিম্নলিখিত পদ্ধতিতে অ্যারেগুলিতে অদলবদল করতে পারেন:
list[x] = [list[y],list[y]=list[x]][0]
নিম্নলিখিত উদাহরণটি দেখুন:
list = [1,2,3,4,5]
list[1] = [list[3],list[3]=list[1]][0]
//list is now [1,4,3,2,5]
দ্রষ্টব্য: এটি নিয়মিত ভেরিয়েবলের জন্য একইভাবে কাজ করে
var a=1,b=5;
a = [b,b=a][0]
[list[x], list[y]] = [list[y], list[x]];
।
this[0] > this[1] && (this[0] = [this[1],this[1]=this[0]][0]);
সংখ্যার মানগুলির সাহায্যে আপনি বিটওয়াইজ জোর ব্যবহার করে একটি অস্থায়ী পরিবর্তনশীল এড়াতে পারবেন
list[x] = list[x] ^ list[y];
list[y] = list[y] ^ list[x];
list[x] = list[x] ^ list[y];
বা একটি গাণিতিক যোগফল (উল্লেখ করে যে এটি কেবল তখনই কাজ করে যদি x + y ডাটা টাইপের সর্বাধিক মানের চেয়ে কম হয়)
list[x] = list[x] + list[y];
list[y] = list[x] - list[y];
list[x] = list[x] - list[y];
list[y] = list[x] - list[x];
শুধু সমার্থক list[y] = 0;
?
যখন প্রশ্ন জিজ্ঞাসা করা হয়েছিল তখন এটি উপস্থিত ছিল না, তবে ES2015 আপনাকে অ্যারে ডেস্ট্রাকচারিংয়ের সূচনা করেছিল, আপনাকে এটি নীচে লিখতে দিয়েছিলেন:
let a = 1, b = 2;
// a: 1, b: 2
[a, b] = [b, a];
// a: 2, b: 1
[list[x], list[y]] = [list[y], list[x]];
Http://www.greywyvern.com/?post=265 থেকে ডাইজেস্ট
var a = 5, b = 9;
b = (a += b -= a) - b;
alert([a, b]); // alerts "9, 5"
swap(a, b)
ফাংশনে আবদ্ধ করেন তবে আপনার পঠনযোগ্যতা নিয়ে চিন্তা করার দরকার নেই।
ডিস্ট্রাকচারিং-এসাইনমেন্ট সম্পর্কে কী?
var arr = [1, 2, 3, 4]
[arr[index1], arr[index2]] = [arr[index2], arr[index1]]
যা প্রসারিতও হতে পারে
[src order elements] => [dest order elements]
তৃতীয় ভেরিয়েবল সংজ্ঞায়িত করার প্রয়োজন ছাড়াই এ জাতীয় সমাধান বিবেচনা করুন:
function swap(arr, from, to) {
arr.splice(from, 1, arr.splice(to, 1, arr[from])[0]);
}
var letters = ["a", "b", "c", "d", "e", "f"];
swap(letters, 1, 4);
console.log(letters); // ["a", "e", "c", "d", "b", "f"]
দ্রষ্টব্য: অ্যারের দৈর্ঘ্যের জন্য আপনি অতিরিক্ত চেক যোগ করতে চাইতে পারেন। এই সমাধানটি পরিবর্তনীয়, তাই swap
ফাংশনটিকে নতুন অ্যারে ফিরিয়ে দেওয়ার দরকার নেই, এটি কেবল অ্যারেতে রূপান্তরিত করে।
arr.splice(from, 1, arr.splice(to, 1, ...arr[from]))
আপনি এই জাতীয় কোনও সাধারণ পরিচয় ফাংশন ব্যবহার করে যে কোনও সংখ্যক অবজেক্ট বা আক্ষরিক, এমনকি বিভিন্ন প্রকারের অদলবদল করতে পারেন:
var swap = function (x){return x};
b = swap(a, a=b);
c = swap(a, a=b, b=c);
আপনার সমস্যার জন্য:
var swap = function (x){return x};
list[y] = swap(list[x], list[x]=list[y]);
এটি জাভাস্ক্রিপ্টে কাজ করে কারণ এটি ঘোষিত বা ব্যবহৃত না হলেও এটি অতিরিক্ত যুক্তি গ্রহণ করে। কার্যাদি অ্যাসাইনমেন্ট a=b
ইত্যাদির পরে ঘটবে a
।
list[y] = (function(x){return x})(list[x],list[x]=list[y]);
। অথবা, যদি আপনি ES6 (জাতীয় পরবর্তী সংস্করণ) প্রতি আগ্রহ দেখিয়েছেন, এটা অন্যন্ত সহজ: [list[x], list[y]] = [list[y], list[x]
। আমি খুব খুশি যে তারা জাভাস্ক্রিপ্টের পরবর্তী সংস্করণে আরও কিছু কার্যকরী এবং শ্রেণিভিত্তিক দিকগুলি যুক্ত করছে।
[list[y], list[x]] = [list[x], list[y]];
কোন অস্থায়ী পরিবর্তনশীল প্রয়োজন!
আমি কেবল কল করার কথা ভাবছিলাম list.reverse()
।
তবে তখন আমি বুঝতে পারি এটি কেবল তখনই বদলে যাবে list.length = x + y + 1
।
আমি মানচিত্র এবং মানচিত্র সহ বিভিন্ন আধুনিক জাভাস্ক্রিপ্ট নির্মাণের দিকে নজর রেখেছি , তবে দুর্ভাগ্যক্রমে কোনওটিই এমন কোডের ফলস্বরূপ ফল লাভ করতে পারেনি যা এই পুরাতন, লুপ-ভিত্তিক নির্মাণের চেয়ে আরও কমপ্যাক্ট বা দ্রুততর ছিল:
function multiswap(arr,i0,i1) {/* argument immutable if string */
if (arr.split) return multiswap(arr.split(""), i0, i1).join("");
var diff = [];
for (let i in i0) diff[i0[i]] = arr[i1[i]];
return Object.assign(arr,diff);
}
Example:
var alphabet = "abcdefghijklmnopqrstuvwxyz";
var [x,y,z] = [14,6,15];
var output = document.getElementsByTagName("code");
output[0].innerHTML = alphabet;
output[1].innerHTML = multiswap(alphabet, [0,25], [25,0]);
output[2].innerHTML = multiswap(alphabet, [0,25,z,1,y,x], [25,0,x,y,z,3]);
<table>
<tr><td>Input:</td> <td><code></code></td></tr>
<tr><td>Swap two elements:</td> <td><code></code></td></tr>
<tr><td>Swap multiple elements: </td> <td><code></code></td></tr>
</table>
অদলবদলের একটি আকর্ষণীয় উপায় রয়েছে:
var a = 1;
var b = 2;
[a,b] = [b,a];
(ES6 উপায়)
var a= [7,8,9,10], i=2, j=3;[a[i],a[j]] = [a[j],a[i]];
var a = [1,2,3,4,5], b=a.length;
for (var i=0; i<b; i++) {
a.unshift(a.splice(1+i,1).shift());
}
a.shift();
//a = [5,4,3,2,1];
এখানে একটি কমপ্যাক্ট সংস্করণ i1 এ আরআর i2 সহ মান অদলবদল
arr.slice(0,i1).concat(arr[i2],arr.slice(i1+1,i2),arr[i1],arr.slice(i2+1))
এখানে একটি প্রকরণ রয়েছে যা সূচকের অ্যারেতে উপস্থিত রয়েছে কিনা তা প্রথমে পরীক্ষা করে:
Array.prototype.swapItems = function(a, b){
if( !(a in this) || !(b in this) )
return this;
this[a] = this.splice(b, 1, this[a])[0];
return this;
}
this
সূচকটি উপস্থিত না থাকলে এটি কেবলমাত্র ফিরে আসবে তবে আপনি ব্যর্থতার সাথে আচরণটি সহজেই সংশোধন করতে পারেন
কেবল এটির মজাদার জন্য, কোনও অতিরিক্ত ভেরিয়েবল ব্যবহার না করে অন্য উপায় হ'ল:
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
// swap index 0 and 2
arr[arr.length] = arr[0]; // copy idx1 to the end of the array
arr[0] = arr[2]; // copy idx2 to idx1
arr[2] = arr[arr.length-1]; // copy idx1 to idx2
arr.length--; // remove idx1 (was added to the end of the array)
console.log( arr ); // -> [3, 2, 1, 4, 5, 6, 7, 8, 9]
সংক্ষিপ্তসার জন্য, এখানে অদ্ভুত ওয়ান-লাইনারের সংস্করণ যা উপরের সমস্ত কাঠামো এবং কাটা কাটা থেকে কিছুটা কম কুশ্রী। গৃহীত উত্তরটি সত্যই আরও বেশি পঠনযোগ্য পথে যাওয়ার উপায়।
প্রদত্ত:
var foo = [ 0, 1, 2, 3, 4, 5, 6 ];
আপনি যদি দুটি সূচকের (অ এবং খ) মান পরিবর্তন করতে চান; তাহলে এটি এটি করবে:
foo.splice( a, 1, foo.splice(b,1,foo[a])[0] );
উদাহরণস্বরূপ, আপনি যদি 3 এবং 5 কে অদলবদল করতে চান তবে আপনি এটি এইভাবে করতে পারেন:
foo.splice( 3, 1, foo.splice(5,1,foo[3])[0] );
অথবা
foo.splice( 5, 1, foo.splice(3,1,foo[5])[0] );
উভয়ই একই ফলাফল দেয়:
console.log( foo );
// => [ 0, 1, 2, 5, 4, 3, 6 ]
#splicehatersarepunks :)
আপনি যদি ES5 তে টেম্প ভেরিয়েবল ব্যবহার করতে না চান তবে অ্যারের উপাদানগুলিকে অদলবদল করার এটি একটি উপায়।
var swapArrayElements = function (a, x, y) {
if (a.length === 1) return a;
a.splice(y, 1, a.splice(x, 1, a[y])[0]);
return a;
};
swapArrayElements([1, 2, 3, 4, 5], 1, 3); //=> [ 1, 4, 3, 2, 5 ]
a.splice
করছেন কারণ সরানো উপাদানগুলির সাথে অ্যারে প্রদান করে। বিকাশকারী.মোজিলা.আর.ইন-
এই ফাংশন চেষ্টা করুন ...
$(document).ready(function () {
var pair = [];
var destinationarray = ['AAA','BBB','CCC'];
var cityItems = getCityList(destinationarray);
for (var i = 0; i < cityItems.length; i++) {
pair = [];
var ending_point = "";
for (var j = 0; j < cityItems[i].length; j++) {
pair.push(cityItems[i][j]);
}
alert(pair);
console.log(pair)
}
});
function getCityList(inputArray) {
var Util = function () {
};
Util.getPermuts = function (array, start, output) {
if (start >= array.length) {
var arr = array.slice(0);
output.push(arr);
} else {
var i;
for (i = start; i < array.length; ++i) {
Util.swap(array, start, i);
Util.getPermuts(array, start + 1, output);
Util.swap(array, start, i);
}
}
}
Util.getAllPossiblePermuts = function (array, output) {
Util.getPermuts(array, 0, output);
}
Util.swap = function (array, from, to) {
var tmp = array[from];
array[from] = array[to];
array[to] = tmp;
}
var output = [];
Util.getAllPossiblePermuts(inputArray, output);
return output;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
var arr = [1, 2];
arr.splice(0, 2, arr[1], arr[0]);
console.log(arr); //[2, 1]
ES6 ব্যবহার করে এটি এটি করা সম্ভব ...
কল্পনা করুন আপনার এই 2 টি অ্যারে রয়েছে ...
const a = ["a", "b", "c", "d", "e"];
const b = [5, 4, 3, 2, 1];
এবং আপনি প্রথম মানগুলি অদলবদল করতে চান:
const [a0] = a;
a[0] = b[0];
b[0] = a0;
এবং মান:
a; //[5, "b", "c", "d", "e"]
b; //["a", 4, 3, 2, 1]
Array.prototype.swap = function(a, b) {
var temp = this[a];
this[a] = this[b];
this[b] = temp;
};
ব্যবহার:
var myArray = [0,1,2,3,4...];
myArray.swap(4,1);
Array
প্রোটোটাইপ প্রসারিত করা যা চাওয়া হয়েছিল তার অংশ ছিল না - এটি ভাল করার চেয়ে আরও বেশি বিভ্রান্ত হতে পারে।
যদি প্রয়োজন হয় তবে প্রথম এবং শেষ উপাদানগুলি কেবলমাত্র অদলবদল করুন:
array.unshift( array.pop() );
[1, 2, 3] => [3, 1, 2]
পরিবর্তে [1, 2, 3] => [3, 2, 1]
।
a = [b, b = a][0];
দ্বারা বর্তমান স্কোপটিকে দূষিত না করেই আসলে একই সাথে একত্রে স্বাপ অর্জন করতে পারে: @ জ্যানের দ্বারা উল্লেখ করা হয়েছে যদিও আমি এখনও নিজেকে ক্রস-ল্যাঙ্গুয়েজ হিসাবে অস্থায়ী পরিবর্তনশীল পদ্ধতির ব্যবহার খুঁজে পাই (যেমন সি / সি ++ ) এবং প্রথম দৃষ্টিভঙ্গি যা সাধারণত আমার মনে আসে।