2011-05-01 2 views
1

Я пытаюсь сплайсировать массив два из двумерного массива arr.Почему splice возвращает строку вместо массива?

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

Возможно, вы, возможно, неправильно протестировали или что-то еще? Я не могу воспроизвести это. 'arr.splice (1,1)' должен работать для вас. Вот скрипка рабочей версии. http://jsfiddle.net/pNgTh/ – Robert

+0

Что такое «строковый порождающий массив»? – Gabe

+0

Ха-ха, тик, как в строке «в строке массива». – Gary

ответ

4

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

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

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

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

Отлично, это именно то, что я искал. Благодаря! – Gary

+0

Я потратил час на это, прежде чем наткнулся на ваше решение. Благодаря! –

0

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

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

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

+0

arr.splice (1,1) связывает правильный массив и удаляет элемент, как ожидалось. Проблема в том, что возвращаемое не является массивом. alert (arr.splice (1,1) [0]) показывает «c, d» не «c», как ожидалось. – Gary

+0

Да, это потому, что сращивание всегда возвращает массив. например, 'var arr = [1,2,3,4]' и 'arr.slice (1,1)' будет [1] –

+0

Это не то, что происходит ... arr.slice (1,1) должно быть массив, но если мы попытаемся посмотреть индекс 0 того, что было возвращено, мы увидим, что массив не был возвращен, но строка каждого элемента массива конкатенирована. – Gary

2

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

Смежные вопросы