Почему splice возвращает строку вместо массива? - PullRequest
1 голос
/ 01 мая 2011

Я пытаюсь склеить массив два из двумерного массива 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);

Ответы [ 3 ]

4 голосов
/ 01 мая 2011

Интересное наблюдение. Из спецификации ECMA (262, изд. 5):

Когда метод соединения вызывается с начинаются два или более аргумента, deleteCount и (необязательно) item1, item2 и т. д., элементы deleteCount массива, начинающегося с индекса массива начало заменяется аргументами item1, item2 и т. д. Объект Array содержащий удаленные элементы (если любой) возвращается .

Array.splice при этом возвращает массив удаленных элементов . Итак, если вы хотите сослаться на удаленный массив, это должен быть синтаксис:

var rem = arr.splice(1,1)[0];
alert(rem[0]); //=> 'c'
2 голосов
/ 01 мая 2011

Вы, кажется, смущены, возможно, тем, что происходит, когда вы передаете массив в 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"], который, как я думал, вы хотели.

0 голосов
/ 01 мая 2011

Я думаю, что его метод работы ожидаемого соединения всегда возвращает массив.

, когда вы говорите arr [1] .splice (0);его вызов spilce на один и дает ['a']

и когда вы делаете arr.splice (1,1);он вернет [один]

...