回答:
一時変数は1つだけ必要です。
var b = list[y];
list[y] = list[x];
list[x] = b;
10年後、ハイジャックの編集を編集して、多くのES6を採用しました。
配列を指定するとarr = [1,2,3,4]
、次のように1行の値を交換できます。
[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]
残りのアレイなしでのみ生産
ネイティブJavaScriptを使用して単一の式が必要な場合は、スプライス操作からの戻り値に、削除された要素が含まれていることに注意してください。
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];
b変数が残りのスコープに存在することを意味します。これにより、メモリリークが発生する可能性があります。ありそうもないが、それでも避けた方が良い。
これをArray.prototype.swapに入れるとよいでしょう。
Array.prototype.swap = function (x,y) {
var b = this[x];
this[x] = this[y];
this[y] = b;
return this;
}
これは次のように呼び出すことができます:
list.swap( x, y )
これは、メモリリークとDRYの両方を回避するためのクリーンなアプローチです。
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; };
よるとMetafilter上のいくつかのランダムな人、「Javascriptの最近のバージョンは、あなたがはるかにきれいに(とりわけ)スワップを行うことができ:」
[ list[x], list[y] ] = [ list[y], list[x] ];
私の簡単なテストでは、このPythonicコードは、現在「Google Apps Script」(「。gs」)で使用されているJavaScriptのバージョンでうまく機能することがわかりました。悲しいかな、さらなるテストは、このコードが「Uncaught ReferenceError:Invalid left-side side in assignment」を与えることを示しています。JavaScript( ".js")のどのバージョンでも、Google Chromeバージョン24.0.1312.57で使用されています。
まあ、あなたは両方の値をバッファリングする必要はありません-1 つだけ:
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]);
数値では、ビットごとのxorを使用して一時変数を回避できます
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;
ですか?
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)
関数でラップする場合、読みやすさについて心配する必要はありません。
Destructuring_assignmentはどうですか
var arr = [1, 2, 3, 4]
[arr[index1], arr[index2]] = [arr[index2], arr[index1]]
これも拡張できます
[src order elements] => [dest order elements]
3番目の変数を定義する必要のない、このようなソリューションを検討してください。
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]);
これは、宣言または使用されていない場合でも追加の引数を受け入れるため、JavaScriptで機能します。割り当てa=b
などa
は、関数に渡された後に発生します。
list[y] = (function(x){return x})(list[x],list[x]=list[y]);
。または、ES6(JSの次のバージョン)に興味がある場合は、非常に簡単です[list[x], list[y]] = [list[y], list[x]
。JavaScriptの次のバージョンに、より機能的でクラスベースの側面を追加してくれて本当に嬉しいです。
[list[y], list[x]] = [list[x], list[y]];
一時的な変数は必要ありません!
ただ電話することを考えていましたlist.reverse()
。
しかし、それはときにのみスワップとして機能することに気づきましたlist.length = x + y + 1
。
私はMapやmapなど、この効果を実現するためにさまざまな最新のJavascript構造を調べましたが、残念ながら、この古い形式のループベースの構造よりもコンパクトで高速なコードはありませんでした。
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>
これは、arrのi2でi1のコンパクトバージョンスワップ値です。
arr.slice(0,i1).concat(arr[i2],arr.slice(i1+1,i2),arr[i1],arr.slice(i2+1))
ただ面白くするために、追加の変数を使用しない別の方法は次のとおりです。
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 ];
2つのインデックス(aとb)の値を入れ替えたい場合。その後、これはそれを行います:
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で一時変数を使用したくない場合、これは配列要素を交換する1つの方法です。
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
要素が削除された配列を返すため、2つの新しい配列を作成します。developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
この機能を試してください...
$(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]
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];
@Janによって尖ったアウトとして、それはクロス言語(例えばC / Cだと、私はまだ自分自身が一時変数のアプローチを利用見つけるものの++ )そして、通常私の頭に浮かぶ最初のアプローチ。