2012-09-02 223 views
1

我已經有了一個數組,並且我想按照某種模式對這些數據進行隨機洗牌 (我試圖在JavaScript中製作一個rubics多維數據集)。 我想將value2分配給值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/

不管怎麼說,關於您的評論。看到你將要旋轉的指針不是預先確定的,而且會有所不同,最好使用一個函數。
將通過您定義的指針迭代的函數。 http://jsfiddle.net/w2jGr/

不過,如果你喜歡使用的原型功能,這只是一個數組的方法,您可以:

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); 

這裏的工作示例執行該功能定義一個屬性並從那裏訪問它。

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

謝謝!我用舊的scool方式暫時解決了我的問題:由變量變量,但我認爲這是一個更短的問題!非常感謝!!! –

0

爲什麼不把你的值放在一個數組中,並且當你想使用不同的值時只是改變索引指針呢?

+0

雖然這會簡化他的代碼,但這是一個建議,而不是一個解決方案,應該在評論中改爲 – Overcode

+0

否。這是一個建議的解決方案。 – podiluska

+0

他問是否有辦法優化變量的移動,而不必手動定義每個重新分配。你給了他另一種方法來定義他的變量 – Overcode