2012-09-02 2 views
1

У меня есть массив, и я хочу перетасовать их в соответствии с определенным шаблоном (я пытаюсь сделать кубик rubics в javascript). Я хочу назначить значение2 для значения 1 и значение 1 для значения 3 и значение 3 для значения 2. Я могу сделать это в пределах 4 строк кода, но есть ли более короткий путь? нравится:присваивать переменную 1 переменной 2 и переменной 2 переменной 3 javascript

temp = var3; //make temporary variable 
(var3 = var2) = var1;//put var2 in var3 and var3 in var1 
var1 = temp;//put var3/temp in var1 

я знаю, что он не работает таким образом, но вы, ребята, знаете, как это действительно работает? , что было бы полезно при циклировании 8 переменных.

спасибо, Tempestas Ludi.

ответ

0

Если вы имеете дело с более чем 2-х переменных, это всегда лучше использовать массив, поскольку массивы имеют встроенные функции, которые вы можете использовать

var nums = [1,2,3]; // this is your array. it can have any length you want 
// this is one line that does the magic 
nums.push(nums.shift()); // to the left 
nums.unshift(nums.pop()); // to the right 

http://jsfiddle.net/wbKYY/2/
http://jsfiddle.net/wbKYY/4/

Во всяком случае, о ваших комментариях. Видя, как указатели, которые вы будете вращать, не предопределены и будут меняться, вероятно, лучше использовать функцию.
Функция, которая будет проходить через указатели, которые вы определяете.

function rotateArr(arr,pointers,dir) { 
    var narr = arr; // create a local copy we can use it 
    var savevalue; 
    if (dir == 1) { // rotate to the right 
     savevalue = narr[pointers[pointers.length-1]]; // save the last value 
     for(var i=pointers.length-2;i>=0;i--) { 
      narr[pointers[i+1]] = narr[pointers[i]]; 
     } 
     narr[pointers[0]] = savevalue; // set the first value 
    } else { // rotate to the left 
     savevalue = narr[pointers[0]]; // save the first value 
     for(var i=0;i<pointers.length-1;i++) { 
      narr[pointers[i]] = narr[pointers[i+1]]; 
     } 
     narr[pointers[pointers.length-1]] = savevalue; // set the last value 
    } 
    return narr; 
} 
// arr is the array of faces 
// pointers is the elements which you want to rotate (an array) 
// dir is either 1 or -1 

вы можете выполнить эту функцию с

nums = rotateArr(nums,[pointers],[1,-1]); 
// just some examples 
nums = rotateArr(nums,[0,1,2,5],1); 
nums = rotateArr(nums,[3,6,1,4],-1); 

Вот рабочий пример: http://jsfiddle.net/w2jGr/

Однако, если вы предпочитаете использовать функцию прототипа, который является только метод массива, вы можете определить свойство и просто получить от него доступ.

Object.defineProperty(Object.prototype, "rotateArr", { value: function(pointers,dir) { 
    var savevalue; 
    if (dir == 1) { // rotate to the right 
     savevalue = this[pointers[pointers.length-1]]; // save the last value 
     for(var i=pointers.length-2;i>=0;i--) { 
      this[pointers[i+1]] = this[pointers[i]]; 
     } 
     this[pointers[0]] = savevalue; 
    } else { // rotate to the left 
     savevalue = this[pointers[0]]; // save the last value 
     for(var i=0;i<pointers.length-1;i++) { 
      this[pointers[i]] = this[pointers[i+1]]; 
     } 
     this[pointers[pointers.length-1]] = savevalue; 
    } 
}, enumerable : false}); 

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

nums.rotate([pointers],dir); 

http://jsfiddle.net/w2jGr/1/

+0

спасибо, но когда я хочу переместить массив [0] в массив [2], массив [2] в массив [8], массив [8] в массив [6] и массив [6] в массив [0], который требуется для поворота углов одной стороны куба, я не могу использовать его, потому что в этих индексах нет какой-либо разумной картины. Это немного моя проблема. –

+0

ах, я вижу. я напишу еще одно решение. в то же время, вы должны уточнить это в своем вопросе. – Overcode

+0

Спасибо! Я временно решил проблему на старом пути: переменная переменной, но я думаю, что это намного короче! Большое спасибо!!! –

0

Почему бы не поместить ваши значения в массив и просто изменить указатель указателя, если вы хотите использовать разные значения?

+0

, в то время как это упростило бы его код, это рекомендация, а не решение, и вместо этого следует оставить комментарии – Overcode

+0

№. Это предлагаемое решение. – podiluska

+0

Он спросил, есть ли способ оптимизировать перемещение переменных, без необходимости вручную определять каждое переназначение. Вы дали ему другой способ определить свои переменные. – Overcode

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