0
Array.prototype.move = function(oldIndex, newIndex) {
    var val = this.splice(oldIndex, 1);
    this.splice(newIndex, 0, val[0]);
}

//Testing - Change array position
var testarray = [1, 2, 3, 4];
testarray.move(3, 0);
console.log(testarray);

これにより、「this.splice is not a function」というエラーが発生しますが、目的の結果が返されます。なんで?

4

3 に答える 3

1
Array.prototype.move = function(oldIndex, newIndex) {
    if(Object.prototype.toString.call(this) === '[object Array]') {
        if(oldIndex && typeof oldIndex == 'number' && newIndex && typeof newIndex == 'number') {
            if(newIndex > this.length) newIndex = this.length;
            this.splice(newIndex, 0, this.splice(oldIndex, 1)[0]);
        }
    }
};

なんらかの理由で、ロード時にドキュメントによって呼び出された関数が呼び出されています(まだそれを理解していません)。これが配列であることを確認するためにいくつかのチェックを追加し、指定された int が全長よりも大きい場合は、新しいインデックスを合計サイズに等しくなるようにリセットしました。これにより、私が抱えていたエラーの問題が解決されました。私にとっては、オブジェクトを配列内で移動する最も簡単な方法です。関数が onload と呼ばれる理由については、私のコードと関係があるに違いありません。

于 2012-06-07T03:52:11.123 に答える
0

コードが任意の環境で機能する必要がある場合は、組み込みオブジェクトにプロパティを追加することはお勧めできません。このようなオブジェクトを拡張する場合は、同じまたは同様のことを行う他の誰かが使用する可能性のあるプロパティ名を使用しないでください。

メンバーを「移動」する方法は複数あるようです。あなたがしているように見えることは、「スワップ」という名前の方が適切です。

if (!Array.prototype.swap) {
  Array.prototype.swap = function(a, b) {
    var t = this[a];
    this[a] = this[b];
    this[b] = t; 
  }
}

新しい配列を作成し、古い配列を何度も変更する必要があるメソッドを呼び出すよりも、値の単純な再割り当ての方が効率的であると思います。しかし、それはとにかく議論の余地があるかもしれません。上記は確かに読みやすく、入力する文字が少なくなっています。

上記は安定しておりarray.swap(4,8)、と同じ結果が得られることにも注意してくださいarray.swap(8,4)

堅牢な関数を作成する場合は、最初に、インデックスがarray.lengthより大きい場合、またはインデックスが存在しない場合などに何をするかを検討する必要があります。例えば

var a = [,,2]; // a has length 3
a.swap(0,2);

上記では、0または1にはメンバーがなく、2にのみメンバーがいます。したがって、結果は次のようになります。

a = [2]; // a has length 1

またはそれが必要です(これは上記の結果になります):

a = [2,,undefined]; // a has length 3

また

a = [2,,,]; // a has length 3 (IE may think it's 4, but that's wrong)

編集

OPでは、次の結果に注意してください。

var b = [,,2];
b.move(0,2);

alert(b); // [,2,];

これは期待されたものではないかもしれません、そして

b.move(2,0);
alert(b); // [2,,];

ですから、それも安定していません。

于 2012-06-07T00:44:02.063 に答える
0

プレースホルダー変数は必要ありません-

Array.prototype.move = function(oldIndex, newIndex) {
       this.splice(newIndex, 0, this.splice(oldIndex, 1)[0]);
}
var a=[1,2,3,4,9,5,6,7,8];
a.move(4,8);

a[8]
/*  returned value: (Number)
9
*/
于 2012-06-07T00:18:00.937 に答える