26.07.2010, 23:43
|
Аспирант
|
|
Регистрация: 19.01.2010
Сообщений: 42
|
|
splice массива массивов
Доброго времени суток.
Что-то не работает моя задумка...
Есть массив (arr), все его элементы тоже массивы. В родительском массиве мне нужно поменять местами элементы, делаю примерно так:
// сохраняю элемент массива
var temp_var = arr.splice(some_index, 1);
// вставляю его ниже следующего элемента
arr.splice((some_index++), 0, temp_var);
Получается, что нижний элемент оказывается сверху, бывший верхний снизу, но имеет тип undefined.
После
var temp_var = arr.splice(some_index, 1);
алертом проверял переменную, который показал, что она - объект, который содержит все элементы дочернего массива.
Разъясните, пожалуйста, в чем я заблуждаюсь?
Спасибо.
|
|
27.07.2010, 01:19
|
Любитель
|
|
Регистрация: 16.12.2009
Сообщений: 422
|
|
vahrusha, Вам нужно их сортировать? Метод splice удаляет элементы или заменяет удалённые новыми
Последний раз редактировалось JsLoveR, 27.07.2010 в 01:35.
|
|
27.07.2010, 03:55
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,123
|
|
проверьте существуетли элемент массива arr[some_index++] после того как вы удалили arr[some_index]
может так проще менять элементы массива местами:
Array.prototype.exchange = function (a, b) {
if (this[a] && this[b]) {
var c = this[a];
this[a] = this[b];
this[b] = c
}
return this
};
var arr=[[1,1,1,1,1],[2,2,2,2,2],[3,3,3,3,3],[4,4,4,4,4],[5,5,5,5,5]];
alert(arr.exchange(0,1));
Последний раз редактировалось рони, 27.07.2010 в 06:29.
|
|
27.07.2010, 06:23
|
Аспирант
|
|
Регистрация: 19.01.2010
Сообщений: 42
|
|
Да, так действительно много легче. Я новичек в программировании, поэтому все прелести ООП не освоил, а Ваш пример очень подходит для меня.
Спасибо отписавшимся.
|
|
27.07.2010, 06:25
|
|
|
|
Регистрация: 27.12.2008
Сообщений: 4,201
|
|
var arr=[[1,1,1,1,1],[2,2,2,2,2],[3,3,3,3,3],[4,4,4,4,4],[5,5,5,5,5]];
var some_index = 2;
var temp_var = arr.splice(some_index, 1);
arr.splice(some_index+1, 0, temp_var);
alert(arr);
и рони правильно советует, только не change (изменить), а swap или exchange
|
|
27.07.2010, 07:59
|
Аспирант
|
|
Регистрация: 19.01.2010
Сообщений: 42
|
|
Метод, который предложил рони очень хорош, но в этом случае, как я понял индексы элементов остаются прежними (порядок меняется), получается что-то вроде:
arr[0], arr[1], arr[3], arr[2]
...
Эх, а порядок индексов мне важен. Как-нибудь можно сделать, чтобы в массиве индексы расставить по порядку, не меняя местами содержание элементов при этом.
Спасибо.
|
|
27.07.2010, 08:27
|
Аспирант
|
|
Регистрация: 19.01.2010
Сообщений: 42
|
|
Виноват, метод индексы меняет автоматически. Заблуждения возникли вот по какой причине...
Функционал я задумал такой: нажимаем кнопочку - элемент списка(массива) с пускается на одну позицию вниз (метод, предложенный рони). Когда элемент таким образом спускается в самый низ, кнопку я скрываю. примерно так:
...
if(elem_index == (arr.length-1)){
document.getElementById('some_id').className = 'hide';
}else{
document.getElementById('some_id').className = 'show';
}
Почему то кнопка не скрывается.
НО если сделать так:
alert(elem_index);
alert(arr.length-1);
if(elem_index == (arr.length-1)){
document.getElementById('some_id').className = 'hide';
}else{
document.getElementById('some_id').className = 'show';
}
То после двух алертов окон, она скрывается!
Как это понимать?
|
|
27.07.2010, 09:14
|
|
|
|
Регистрация: 27.12.2008
Сообщений: 4,201
|
|
шутка от разработчиков браузера а если серьезно - отлаживать надо, причем советую тебе firefox+firebug+console.log вместо alert. И ты даже не сказал, выполняется ли условие в этих вариантах, назначается ли класс. Можешь, в принципе, попробовать дать ссылку на страницу
Сообщение от vahrusha
|
Функционал я задумал такой: ...
|
а это полезно в любом случае рассказывать, потому что решение может быть совсем не таким, как ТС себе придумал, и чем больше он не в теме, тем справделивее это утверждение
|
|
27.07.2010, 15:12
|
Аспирант
|
|
Регистрация: 19.01.2010
Сообщений: 42
|
|
Что интересно, условие выполняется и класс меняется (а в классе display:none), но кнопка все равно отображается.
Такая проблема с этой функцией (которая скрывает кнопку), возникает только тогда, когда она работает в паре с методом, который предложил рони.
Т.е. если просто выбрать нижний элемент, кнопка нормально скрывается.
Могу конечно и ссылку на страницу дать, но там много "букаф"...
Последний раз редактировалось vahrusha, 27.07.2010 в 15:20.
|
|
27.07.2010, 15:41
|
Аспирант
|
|
Регистрация: 19.01.2010
Сообщений: 42
|
|
Понял я причину бедствий.
У меня на скрываемой кнопке вот что было понавешано:
<div id="down_cat_but" title="Переместить категорию вниз по списку" class="but1" style="width:20px;margin:10px 5px 10px 0;float:left" onmouseover="this.className='but2';" onmousedown="this.className='but3';" onmouseup="this.className='but2';" onmouseout="this.className='but1';" onclick="movecat();">
Когда я перемещал элемент вниз (кликал по кнопке), курсор то оставался над кнопкой - ей присваивался класс "d-n", и сразу тот, что на mouseover, и кнопка оставалась видимой.
А когда я алерты добавлял, то мышкой по ОК кликал - курсор с кнопки убирал, событие onmouseover не срабатывало...
Вот так вот.
|
|
|
|