0

二次元配列arrから配列twoをスプライスしようとしています。

var one = ["a","b"];  
var two = ["c","d"];  
var thr = ["e","f"];  
var arr = [one,two,thr];

ここに私の2つの失敗した試みがあります:

1)

var rem = arr.splice(1,1);  
alert(rem[0]);  
// This alerts the entire array as one long string "c,d".
// The expected behavior is "c" (index 0 of the returned array _rem_).

2)

var rem = arr[1].splice(0);  
alert(arr);  
// The array _rem_ is now correct, but _arr_ is left with an empty index: "a,b,,e,f".

理想的とは言えない回避策がありますが、1 つの関数でこれを達成したいと考えています。

var test = arr[1].slice(0);  
arr.splice(1,1);
4

3 に答える 3

4

興味深い観察。ECMA 仕様 (262、ed. 5) から:

複数の引数 start、deleteCount、および (オプションで) item1、item2 などを指定して splice メソッドを呼び出すと、配列インデックス start で始まる配列の deleteCount 要素が引数 item1、item2 などに置き換えられます。Array オブジェクト削除された要素 (存在する場合) を含む が返されます。

Array.spliceしたがって、削除された要素の配列を返します。したがって、削除された配列を参照する場合は、次の構文にする必要があります。

var rem = arr.splice(1,1)[0];
alert(rem[0]); //=> 'c'
于 2011-05-01T08:12:17.400 に答える
2

おそらく、配列を に渡すと何が起こるかによって、混乱しているように見えますalert()。あなたが何を望んでいるかについて私が言えることから、あなたの最初の例は正しいです。スプライシングを行う前に、arr変数にあるものは

[
   ["a", "b"],
   ["c", "d"],
   ["e", "f"]
]

を呼び出した後、インデックス 1var rem = arr.splice(1, 1)から 1 つの要素を削除し、それを variable の配列に格納すると、次のようになります。arrrem

arr:

[
   ["a", "b"],
   ["e", "f"]
]

rem:

[
   ["c", "d"]
]

rem[0]array も同様です。これは、あなた["c", "d"]が望んでいたものです。

于 2011-05-01T11:22:00.273 に答える
0

期待どおりに動作する splice メソッドは常に配列を返すと思います。

あなたが言うとき arr[1].splice(0); その呼び出しは 1 つに散らばり、['a'] を与えます

arr.splice(1,1); を実行すると、[1] を返します

于 2011-05-01T04:11:32.180 に答える