Метод Splice()

Тема в разделе "HTML, CSS, XML, JavaScript", создана пользователем AnaStas, 30 янв 2009.

  1. AnaStas

    AnaStas Well-Known Member

    Регистрация:
    16 сен 2008
    Сообщения:
    52
    Симпатии:
    0
    Добрый день.
    Прошу помочь разобраться со следующим моментом:
    1. есть многомерный массив:
    Код (Text):
    arr=new Array();
    2. по какому-то условию вставляется элемент так же Array():
    Код (Text):
    arr.splice(i,0,<Array()>);
    3. работаем с элементами уже вставленного массива и ...?
    И здесь имеем нечто непонятное - следующий за вставленным элемент исходного массива копирует все значения вставленного элемента.
    Где у меня здесь не корректность?
    Для более ясного понимания изложенного прилагаю специально подготовленный листинг со скриншотами алерта.
     

    Вложения:

    • _splice.doc
      Размер файла:
      62 КБ
      Просмотров:
      32
  2. AnaStas

    AnaStas Well-Known Member

    Регистрация:
    16 сен 2008
    Сообщения:
    52
    Симпатии:
    0
    Наконец, разобрался с помощью интернет и учебников. (Сейчас буду сам себе модератор :) ! Тему раскрываю в основном для, таких как я, не опытных программистов)
    1. new Array() - это не массив элементов, а массив адресов элементов. (Ведь понимал это и чего меня заклинило?)
    2. когда используем .splice(i,0,<элемент/массив>), то мы вставляем либо адрес элемента, либо адрес массива адресов элементов. Т.е. в прилагаемом к теме файле отладочного кода в строке
    Код (Text):
    arr.splice(i,0,arr[i];
    был вставлен адрес массива arr из 3-х элементов. Разумеется никакого копирования значений не было, а было обращение к одному и тому же элементу. (В старые добрые времена этот процесс многоступенчатой адресации назывался косвенной адресацией).
    3. Следовательно, правильным будет следующий вариант:
    Код (Text):
    arr.splice(i,0,new Array(arr[i][0],arr[i][1],arr[i][2]);
    Разумеется, можно и так:
    Код (Text):
    arr.splice(i,0,new Array());
    разницы здесь никакой нет, меняется только алгоритм кода.
    Вот и все.
    Тему считаю закрытой.
     
  3. etc

    etc Гость

    Это сути не меняет.
    А в чем тут смысл?
     
  4. AnaStas

    AnaStas Well-Known Member

    Регистрация:
    16 сен 2008
    Сообщения:
    52
    Симпатии:
    0
    (Вот всегда, после закрытия темы, следует просматривать ее еще разок - могут быть дополнительные комментарии Мэтров и, вообще, догоняющие вопросы.)
    И так:
    1. записи из базы данных имеют вид: arr=<index>,<staff>,<group>, т.е., имеем некий массив:
    Код (Text):
     . . . . . . .
    arr[i]=k,"fio-1","m";
    arr[i+1]=k,"fio-1","m";
    arr[i+2]=t,"fio-2","s";
    arr[i+3]=t,"fio-2","m";
    arr[i+4]=t,"fio-2","d";
    arr[i+5]=p,"fio-5","";
    . . . . . . . .
    2. обработка этого массива заключается в следующем: либо удалить, пибо изменить, либо добавить значение элемента <group>.
    3. у меня один из моментов потребовал вставку элемента, скажем так, со значениями t,"fio-2","d", где d должно быть изменено на другую группу. Я взял и написал :
    Код (Text):
    . . . . . . . .
    arr[i+4].splice(i+4,0,arr[i+4]);
    . . . . . . . .
    Соответственно получил ожидаемое:
    Код (Text):
     . . . . . . .
    arr[i]=k,"fio-1","m";
    arr[i+1]=k,"fio-1","m";
    arr[i+2]=t,"fio-2","s";
    arr[i+3]=t,"fio-2","m";
    arr[i+4]=t,"fio-2","d"; // вставлен новый элемент-массив
    arr[i+5]=t,"fio-2","d";
    arr[i+6]=p,"fio-5","";
    . . . . . . . .
    Как видите, внешне никаких ошибок.
    4. изменяю значение 3-го элемениа во вставленном массиве, скажем, на W: arr[i+4][2]="W"; и получаю:
    Код (Text):
     . . . . . . .
    arr[i]=k,"fio-1","m";
    arr[i+1]=k,"fio-1","m";
    arr[i+2]=t,"fio-2","s";
    arr[i+3]=t,"fio-2","m";
    arr[i+4]=t,"fio-2","W"; // вставлен новый элемент-массив
    arr[i+5]=t,"fio-2","W";
    arr[i+6]=p,"fio-5","";
    . . . . . . . .
    5. Увидев это, вместо того чтобы подумать и разобраться, впал в истерику и побежал за помощью на форумы... но очередь ввиду, видимо, простоты вопроса до меня так и не дошла :blink:

    Все это я показал в специально подготовленным красочно оформленном прилагаемом файле.
    Вот, пожалуй и все... если я правильно понял замечание.
     
  5. etc

    etc Гость

    А вот это поветсвование более понятно (для меня!), чем тот файлик. :blink:

    Не, то что вы тут расписали все понятно, непонятно другие, зачем копировать елемент и его потом менять, если можно сразу вставить то что надо?

    хотябы типа того:
    Код (Text):
    arr.splice(i,0,new Array(arr[i][0],arr[i][1],'W');
     
  6. AnaStas

    AnaStas Well-Known Member

    Регистрация:
    16 сен 2008
    Сообщения:
    52
    Симпатии:
    0
    А я и сам не знаю почему это так сделал :blink:
    Было задание доработать один из модулей управления базой данных функцией допуска персонала к определенным группам. Я и вставил элемент-массив с уже готовыми параметрами пользователя и далее играл только с одним значением элемента <group>... Ну, чорт его знает! ... Так алгоритм сложился... Не ставте мне двойку за это :(
    Разумеется, можно и по иному, но опыта у меня недостаточно чтобы пальцы сразу набирали оптимальный код.
     
  7. etc

    etc Гость

    AnaStas Дык, всякое бывает, я к тому что, если бы вы пошли по этому пути, то проблем как в топике и не возникло бы, и время не потеряли бы, и еще всяких мног "бы". Но главное что сами дошли до сути и пофиксили, свой опыт самый лучший, хотя и часто тупой. :blink:
     
  8. AnaStas

    AnaStas Well-Known Member

    Регистрация:
    16 сен 2008
    Сообщения:
    52
    Симпатии:
    0
    etc Спасибо за понимание и дискусию.
    Все, слава Богу, работает, все сложилось... не сложились только сроки... но, вроде бы обошлось и по карману не вдарило :blink:
    Успехов Вам и, как предвижу, до новых встречь!
     
  9. MIRAJ13

    MIRAJ13 Гость

    (Вот всегда, после закрытия темы, следует просматривать ее еще разок - могут быть дополнительные комментарии Мэтров и, вообще, догоняющие вопросы.) изготовление сайта
     
Загрузка...

Поделиться этой страницей