Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 26.07.2010, 23:43
Аспирант
Отправить личное сообщение для vahrusha Посмотреть профиль Найти все сообщения от vahrusha
 
Регистрация: 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);

алертом проверял переменную, который показал, что она - объект, который содержит все элементы дочернего массива.
Разъясните, пожалуйста, в чем я заблуждаюсь?
Спасибо.
Ответить с цитированием
  #2 (permalink)  
Старый 27.07.2010, 01:19
Любитель
Отправить личное сообщение для JsLoveR Посмотреть профиль Найти все сообщения от JsLoveR
 
Регистрация: 16.12.2009
Сообщений: 422

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

Последний раз редактировалось JsLoveR, 27.07.2010 в 01:35.
Ответить с цитированием
  #3 (permalink)  
Старый 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.
Ответить с цитированием
  #4 (permalink)  
Старый 27.07.2010, 06:23
Аспирант
Отправить личное сообщение для vahrusha Посмотреть профиль Найти все сообщения от vahrusha
 
Регистрация: 19.01.2010
Сообщений: 42

Да, так действительно много легче. Я новичек в программировании, поэтому все прелести ООП не освоил, а Ваш пример очень подходит для меня.
Спасибо отписавшимся.
Ответить с цитированием
  #5 (permalink)  
Старый 27.07.2010, 06:25
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 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
Ответить с цитированием
  #6 (permalink)  
Старый 27.07.2010, 07:59
Аспирант
Отправить личное сообщение для vahrusha Посмотреть профиль Найти все сообщения от vahrusha
 
Регистрация: 19.01.2010
Сообщений: 42

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

Эх, а порядок индексов мне важен. Как-нибудь можно сделать, чтобы в массиве индексы расставить по порядку, не меняя местами содержание элементов при этом.
Спасибо.
Ответить с цитированием
  #7 (permalink)  
Старый 27.07.2010, 08:27
Аспирант
Отправить личное сообщение для vahrusha Посмотреть профиль Найти все сообщения от vahrusha
 
Регистрация: 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';
}

То после двух алертов окон, она скрывается!
Как это понимать?
Ответить с цитированием
  #8 (permalink)  
Старый 27.07.2010, 09:14
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

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

Сообщение от vahrusha
Функционал я задумал такой: ...
а это полезно в любом случае рассказывать, потому что решение может быть совсем не таким, как ТС себе придумал, и чем больше он не в теме, тем справделивее это утверждение
Ответить с цитированием
  #9 (permalink)  
Старый 27.07.2010, 15:12
Аспирант
Отправить личное сообщение для vahrusha Посмотреть профиль Найти все сообщения от vahrusha
 
Регистрация: 19.01.2010
Сообщений: 42

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

Последний раз редактировалось vahrusha, 27.07.2010 в 15:20.
Ответить с цитированием
  #10 (permalink)  
Старый 27.07.2010, 15:41
Аспирант
Отправить личное сообщение для vahrusha Посмотреть профиль Найти все сообщения от vahrusha
 
Регистрация: 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 не срабатывало...
Вот так вот.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как проверить название массива? Andrej_2 Общие вопросы Javascript 2 30.06.2010 21:07
Помогите разобраться с повторением при генерации массива (Javascript) JsLoveR Javascript под браузер 4 16.12.2009 15:26
Можно ли как для произвольного массива создавать вызовы функций , имеющих на входе kefi Общие вопросы Javascript 3 17.04.2009 16:53
вставка элементов массива в текстовую форму по клику olezyk Общие вопросы Javascript 3 21.03.2009 22:01