为什么splice返回一个字符串而不是一个数组?

时间:2011-05-01 04:05:01

标签: javascript multidimensional-array array-splice

我正在尝试从二维数组 arr 中拼接数组 two

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

3 个答案:

答案 0 :(得分:4)

有趣的观察。来自ECMA-specs(262,ed.5):

  

调用splice方法时   两个或多个参数开始,   deleteCount和(可选)item1,   item2等,deleteCount元素   从数组索引开始的数组   start被参数替换   item1,item2等 一个Array对象   包含已删除的元素(如果   any)被退回

Array.splice因此返回已删除元素的数组。因此,如果要引用已删除的数组,则应该是语法:

var rem = arr.splice(1,1)[0];
alert(rem[0]); //=> 'c'

答案 1 :(得分:2)

您似乎很困惑,可能是将数组传递给alert()时会发生什么。从我所知道的你想要的东西,你的第一个例子是正确的。在进行任何拼接之前,arr变量中的内容是

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

调用var rem = arr.splice(1, 1)后,它会从索引1的arr中删除一个元素并将其存储在变量rem的数组中,您所拥有的是

arr

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

rem

[
   ["c", "d"]
]

所以rem[0]是数组["c", "d"],这就是我认为你想要的。

答案 2 :(得分:0)

我认为它按预期工作 splice方法总是返回一个数组。

当你说arr [1] .splice(0);它在一个上面调用spilce并给出['a']

当你做arr.splice(1,1);它将返回[1]