2012-05-22 4 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

Спасибо, это было действительно близко к тому, что я искал. В моем фактическом коде 'элементы' могут иметь произвольную длину, а' 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

Вы меняешь массив во время цикла его. И он заменяется дважды для каждой пары, поэтому результат тот же. Вам может понадобиться другой обр хранить отображенное значение:

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

Смежные вопросы