2012-05-22 56 views
1

我試圖動畫與jQuery的幾個要素的排序交換陣列價值觀和我的排序地圖的定義是這樣的:JavaScript的:通過索引

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 example

回答

1
// [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);​ 
+0

謝謝,這真的很接近我正在尋找的東西。在我的實際代碼中,'elements'可以有任意長度,'mapping'通常是2到5,所以我修改了一下你的代碼:http://jsfiddle.net/fxnTG/2/ – Blender

+0

啊,我只有一個測試用例。 –

0

你交換元素兩次從0到5和5比0再次:)嘗試

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

,這將是好的。

Look here

+0

嗯,這不是*很容易。示例映射映射到「5」,但我有一個包含40個元素的列表,而'mapping'元素只包含發生的行交換。我使用反轉例子來說明我的問題。 – Blender

0

你它的一個循環過程中改變陣列。並且每對都交換兩次,所以結果是一樣的。您可能需要另一個ARR存儲映射值:

var result = []; 
for(var i = 0; i<mapping.length; i++){ 
    result[mapping[i][0]] = elements[mapping[i][1]]; 
} 
console.log(result); 
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; 
0

Just_Mad的答案是正確的,如果你只是試圖扭轉名單。但是如果你想能夠處理任何映射配置,你需要一種不同的方法。

如果您不關心內存空間,您可以遍歷映射列表並將索引「mapping [i] [0]」處的元素複製到索引「mapping [i] [1]處的新數組」 」。然後,只需返回新的數組。這應該處理這一切映射你把系統(你只需要決定是否以及如何你要處理的是留下空的空間映射和/或覆蓋空格)

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']