• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Метод Splice()

  • Автор темы AnaStas
  • Дата начала
A

AnaStas

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

Вложения

  • _splice.doc
    62 КБ · Просмотры: 135
A

AnaStas

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

AnaStas

(Вот всегда, после закрытия темы, следует просматривать ее еще разок - могут быть дополнительные комментарии Мэтров и, вообще, догоняющие вопросы.)
А в чем тут смысл?
И так:
1. записи из базы данных имеют вид: arr=<index>,<staff>,<group>, т.е., имеем некий массив:
Код:
 . . . . . . .
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 должно быть изменено на другую группу. Я взял и написал :
Код:
. . . . . . . .
arr[i+4].splice(i+4,0,arr[i+4]);
. . . . . . . .
Соответственно получил ожидаемое:
Код:
 . . . . . . .
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"; и получаю:
Код:
 . . . . . . .
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:

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

etc

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

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

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

AnaStas

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

etc

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

AnaStas

etc Спасибо за понимание и дискусию.
Все, слава Богу, работает, все сложилось... не сложились только сроки... но, вроде бы обошлось и по карману не вдарило :blink:
Успехов Вам и, как предвижу, до новых встречь!
 
M

MIRAJ13

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!