Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   splice массива массивов (https://javascript.ru/forum/misc/10887-splice-massiva-massivov.html)

vahrusha 26.07.2010 23:43

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

алертом проверял переменную, который показал, что она - объект, который содержит все элементы дочернего массива.
Разъясните, пожалуйста, в чем я заблуждаюсь?
Спасибо.

JsLoveR 27.07.2010 01:19

vahrusha, Вам нужно их сортировать? Метод splice удаляет элементы или заменяет удалённые новыми

рони 27.07.2010 03:55

проверьте существуетли элемент массива 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));

vahrusha 27.07.2010 06:23

Да, так действительно много легче. Я новичек в программировании, поэтому все прелести ООП не освоил, а Ваш пример очень подходит для меня.
Спасибо отписавшимся.

x-yuri 27.07.2010 06:25

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

vahrusha 27.07.2010 07:59

Метод, который предложил рони очень хорош, но в этом случае, как я понял индексы элементов остаются прежними (порядок меняется), получается что-то вроде:
arr[0], arr[1], arr[3], arr[2]
...

Эх, а порядок индексов мне важен. Как-нибудь можно сделать, чтобы в массиве индексы расставить по порядку, не меняя местами содержание элементов при этом.
Спасибо.

vahrusha 27.07.2010 08:27

Виноват, метод индексы меняет автоматически. Заблуждения возникли вот по какой причине...
Функционал я задумал такой: нажимаем кнопочку - элемент списка(массива) с пускается на одну позицию вниз (метод, предложенный рони). Когда элемент таким образом спускается в самый низ, кнопку я скрываю. примерно так:
...
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';
}

То после двух алертов окон, она скрывается!
Как это понимать?

x-yuri 27.07.2010 09:14

шутка от разработчиков браузера :) а если серьезно - отлаживать надо, причем советую тебе firefox+firebug+console.log вместо alert. И ты даже не сказал, выполняется ли условие в этих вариантах, назначается ли класс. Можешь, в принципе, попробовать дать ссылку на страницу

Цитата:

Сообщение от vahrusha
Функционал я задумал такой: ...

а это полезно в любом случае рассказывать, потому что решение может быть совсем не таким, как ТС себе придумал, и чем больше он не в теме, тем справделивее это утверждение

vahrusha 27.07.2010 15:12

Что интересно, условие выполняется и класс меняется (а в классе display:none), но кнопка все равно отображается.
Такая проблема с этой функцией (которая скрывает кнопку), возникает только тогда, когда она работает в паре с методом, который предложил рони.
Т.е. если просто выбрать нижний элемент, кнопка нормально скрывается.
Могу конечно и ссылку на страницу дать, но там много "букаф"...

vahrusha 27.07.2010 15:41

Понял я причину бедствий.
У меня на скрываемой кнопке вот что было понавешано:
<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 не срабатывало... :D
Вот так вот.


Часовой пояс GMT +3, время: 09:19.