1

配列があり、特定のパターンに従ってそれらをシャッフルしたいと思います(javascriptでrubicsキューブを作成しようとしています)。value2を値1に、値1を値3に、値3を値2に割り当てたいのですが、4行のコード内でそれを行うことができますが、もっと短い方法はありますか?お気に入り:

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

私はそれがこのように機能しないことを知っていますが、皆さんはそれが機能する方法を知っていますか?これは、8つの変数を循環させるときに役立ちます。

ありがとう、テンペスタスルディ。

4

2 に答える 2

0

値を配列に入れて、別の値を使用する場合はインデックスポインタを変更してみませんか?

于 2012-09-02T18:20:29.610 に答える
0

3つ以上の変数を扱う場合は、配列を使用するのが常に最善です。配列には、使用できる関数が組み込まれているためです。

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/

于 2012-09-02T18:28:37.480 に答える