1

jQueryを使用していくつかの要素の並べ替えをアニメーション化しようとしていますが、並べ替えマップは次のように定義されています。

var mapping = [
  [0, 5],
  [1, 4],
  [2, 3],
  [3, 2],
  [4, 1],
  [5, 0]
];

mapping[0][0]は要素のインデックスでmapping[0][1]あり、はターゲットインデックスです。

私の解決策は基本的にこれでした:

var elements = [1, 2, 3, 4, 5, 6];

for (var i = 0; i < elements.length; i++) {
  var clone1 = elements[mapping[i][0]];
  var clone2 = elements[mapping[i][1]];

  elements[mapping[i][0]] = clone2;
  elements[mapping[i][1]] = clone1;
}

console.log(elements);

問題は、変更しているオブジェクトで作業していて、操作が元に戻されることです。配列を逆にする代わりに、同じ配列を取り戻します。

JavaScriptでこのような要素を交換するにはどうすればよいですか?これがコードのJSFiddleの例です。

4

6 に答える 6

2
// [source, target]
var mapping = [
  [0, 5],
  [1, 4],
  [2, 3],
  [3, 2],
  [4, 1],
  [5, 0]
];

var elements = [1, 2, 3, 4, 5, 6];

function swapElements(elements, mapping) {
    var tmp = new Array(elements.length);
    for(var i = 0, l = mapping.length; i < l; i++) {
        tmp[mapping[i][1]] = elements[mapping[i][0]];
    }
    for(var i = 0, l = elements.length; i < l; i++) {
        elements[i] = tmp[i];
    }
}

swapElements(elements, mapping);

console.log(elements);​
于 2012-05-22T08:00:33.850 に答える
1

アクセサー関数を使用した機能的な楽しみ

var at = function(arr) { return function(i) { return arr[i] } };
[5,4,3,2,0,1].map( at(['a','b','c','d','e','f']) )

これは ['f','e','d','c','a','b'] を返します

于 2014-07-25T19:37:22.753 に答える
0

要素を 0 から 5 に、5 から 0 に 2 回入れ替えます :) 試してください

for (var i = 0; i < elements.length / 2; i++)

そしてそれは大丈夫です。

ここを見て

于 2012-05-22T07:53:18.250 に答える
0

ループ中に配列を変更しています。そして、ペアごとに 2 回交換するので、結果は同じです。マップされた値を保存するには、別の arr が必要になる場合があります。

var result = [];
for(var i = 0; i<mapping.length; i++){
    result[mapping[i][0]] = elements[mapping[i][1]];
}
console.log(result);
于 2012-05-22T07:55:52.437 に答える
0

一時的な配列を定義するだけです:

var elements = [1, 2, 3, 4, 5, 6];
var temp = [];
for (var i = 0; i < elements.length; i++) {
  temp.push(elements[mapping[i][1]]);
}
elements = temp;
于 2012-05-22T07:55:59.513 に答える
0

リストを逆にしようとしているだけなら、Just_Madの答えは正しいです。ただし、任意のマッピング構成を処理できるようにしたい場合は、別のアプローチが必要になります。

メモリ空間を気にしない場合は、マッピング リストを繰り返し処理し、インデックス "mapping[i][0]" の要素をインデックス "mapping [i][1]" の新しい配列にコピーするだけです。次に、新しい配列を返します。これは、システムに入力したマッピングを処理する必要があります(空のスペースを残すマッピングやスペースを上書きするマッピングを処理するかどうか、およびその方法を決定する必要があります)

于 2012-05-22T08:18:59.083 に答える