我正在尝试从二维数组arr中拼接数组两个。
var one = ["a","b"];
var two = ["c","d"];
var thr = ["e","f"];
var arr = [one,two,thr];
以下是我两次不成功的尝试:
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".
我有一个不太理想的解决方案,但我希望用一个函数来完成这个。
var test = arr[1].slice(0);
arr.splice(1,1);
有趣的观察。来自ecma规范(262,第5版):
因此,调用splice方法时两个或更多的论点开始,deleteCount和(可选)item1,item2等,deleteCount元素从数组索引开始的数组的Start被参数替换item1、item2等 Array对象包含已删除的元素(如果any)返回
Array.splice
返回一个包含被删除元素的数组。所以,如果你想引用被删除的数组,语法应该是这样的:
var rem = arr.splice(1,1)[0];
alert(rem[0]); //=> 'c'
您似乎很困惑,可能是当您将数组传递给alert()
时发生的情况。据我所知,你的第一个例子是正确的。在进行任何拼接之前,arr
变量中的内容是
[
["a", "b"],
["c", "d"],
["e", "f"]
]
调用var rem = arr.splice(1, 1)
后,它从arr
中删除索引1处的一个元素并将其存储在变量rem
的数组中,您得到的是
arr
:
[
["a", "b"],
["e", "f"]
]
rem
:
[
["c", "d"]
]
所以rem[0]
是数组["c", "d"]
,这是我认为你想要的。
我认为它的工作是预期的Splice方法总是返回一个数组。
当你说arr[1].splice(0);它的调用拆分为1,并给出['a']
当你执行arr.splice(1,1);它将返回[one]