Просмотр полной версии : удаление элемента из массива
andr_sky
28.06.2002, 20:32
как удалить элемент из массива?
если не известен его порядковый номер,
а известно только значение этого этлемента.
т.е. есть массив ["a", "b", "c"]
надо удалить "c"
я тут сделал проц-ру простым перебором,
но если массив будет большой, то на её выполнение
потребуется какое то время, что неприемлимо совсем,
потому что я её буду часто использовать
function dfa(d) {
l = _root.ej.length;
r = 0;
for (j=0; j<l; j++) {
if (_root.ej[j-r] == d) {
_root.ej.splice(j-r, 1);
r++;
}
}
}
как можно сделать проще??
DeliMIter
28.06.2002, 21:21
Array.splice(elementIndex, 1);
andr_sky
28.06.2002, 22:29
Оригинал написал(а) DeliMIter
Array.splice(elementIndex, 1);
я вроеде писал что неизвестен порядковый номер
элемента, который нужно удалить....
известен лишь сам этот элемент......
так что?
никак кроме как так ?
(в первом сообщении, где CODE дан,
удаление производится из массива _root.ej
... это если кто не понял)
DeliMIter
28.06.2002, 22:44
for (var i=Array.length-1; i>=0; i--)
if (Array[i] == something)
Array.splice(i, 1);
Nox Noctis
28.06.2002, 22:46
а хэш (ассоциативный массив другими словами) вместо простого массива сделать нельзя ?
тогда бы и вопрос сам собой отпал...
andr_sky
29.06.2002, 20:11
не будет ли так любезен Nox Noctis объяснить
что ж это за хрень такая "хэш" .....
Nox Noctis
29.06.2002, 20:53
во флэше хеш - это самая банальная вещь :) ты сам им постоянно пользуешься когда проги на АС пишешь :)
когда ты делаешь обращение вроде: this["something"] - это как раз и есть обращение к ассоциативному массиву, где имена всех методов и пропертей являются ключами.
так я к чему все это -
ты можешь переписать массив задом наперед ?
есть у тебя, скажем, массив вроде:
a = [10,20,30,40];
а ты его перепишешь как
a = [];
a["i10"] = ...;
// в качестве значения такого элемента поставишь то, что тебе нужно...
// а если не нужно можно просто true поставить например :)
a["i20"] = ...;
a["i30"] = ...;
a["i40"] = ...;
вообще, это не будет отличаться от работы с объектами ;)
хочешь удалить элемент со значением N - пишешь
delete a["i"+N];
...это например
недостаток очевиден - чтобы узнать, каким элемент является по порядку тебе придется гнать цикл.
короче тебе надо понять что тебе больше нужно:
моментально находить элемент по его значению, или по его порядковому номеру в массиве.
andr_sky
01.07.2002, 09:52
однако эта штука "хэш" очень полезная.
только вот почему она так называется....
но всё равно мне хэш этот не поможет,
элементы массива совершенно разные типа
"е1", "е2", "е_1", "е3", "mе_1" и тп....
а мне их ещё надо всех перебирать по прядку для проверки всяких там штук....
так что надо обычный Array использовать....
А эти твои элементы не имена мувов часом? Та мож в масиве не имена хранить а сами объекты(тобиш ссылки)? Короче не мудри - если хочешь чтоб помогли - объясняй всю задачу. Но без перебора я думаю врядли обойтись. Не хочешь лишней работы - поставь при выполнении условия ретурн
Nox Noctis
01.07.2002, 21:01
а вообще можно сделать гибрид массива и гусеничного трактора :)
...правда как этого добиться без дублирования структуры, мне пока не понятно :)
но вообще, если элементов не очень много, то можно сделать и хэш и обычный массив... только тогда нужно написать функции, которые их синхронизируют...
DeliMIter
01.07.2002, 21:31
И родился массивный гусенечный трактор, грубое, некультурное существо с тяжелым характером, усугубляемым осознанием собственной бесполезности...
В массиве можно создавать подмассив, при добавлении элементов в массив заносить в подмассив элемент с индексом равным добавляемому (@#$) элементу и значением элемента - массивом с индексом нового элемента в главном массиве. Да буде такой элемент уже есть, в предпоследнем упомянутом массиве добавляется индекс... Вот, собстна, ваш гусенечный друг...
Nox Noctis
01.07.2002, 21:35
помедленнее, пжлст, я записываю... :)
я, например, ничего не понял :) чего ты хочешь сотворить с нашим гусеничным другом ?
DeliMIter
01.07.2002, 21:38
Я хочу показать на его примере, что это не способ решения данной простой проблемы :))))
УильямБрэдберри
02.07.2002, 12:06
чей т вы намутили тут ;)
я думаю так
- хрен ты из массива выдерешь без перебора его значение... если индекса не знаш
даешь производство газонокопалок!
a = [1,2,3];
b[a[0]] = a[0];
c[b[a[0]]] = b[a[0]];
Nox Noctis
02.07.2002, 13:24
ну прям сборище не флэшеров, а бульдозеристов-энтузиастов :)
andr_sky
02.07.2002, 16:21
ну вопщем в атаче то чем я занимаюсь (бета беты).
там управление arrowKeys, space, ctrl, и зажиатый sift для sidestep'ов.
вощем элементы массива это имена мувиков "камней".
когда пуля попадает в мувик (hitTest()) в котором лежат все эти камни,
то надо вычислить в какой именно камень она попала -
для этого делается _перебор_ массива с именами и прверка hitTest'ом
потом значит камень считает сколько ему осталось жить,
если смерть настала, то он должен удалить своё имя из массива имён,
да и сам тоже удаиться - сдесь вот как бы тоже приходитсЯ использовать
_перебор_
так вот значит _перебор_ во воторм случае ничем не заменить.... =(
УильямБрэдберри
02.07.2002, 16:32
ха.
ну дык закинь прямо в каждый камень его индекс при создании
когда массив создаешь
index++
stoun = _root.attachMovie("stoun","stoun"+index,index)
stoun.index = index;
а еще лучше в массиве хранить не имена а ссылки на объекты
Array_stouns = [];
index++
stoun = _root.attachMovie("stoun","stoun"+index,index)
stoun.index = index;
Array_stouns.push(stoun)
greyshaman
02.07.2002, 16:41
Всё хорошо, только газонокасилка в этой задачке не нужна.
greyshaman
02.07.2002, 17:18
А, как вариант:
При попадании аттачить в root мувик размером 1х1 с именем "bst" например и координатами пули
выставить флаг _root.blast=true
а в нужных тебе объектах прописывать
if(_root.blast&&this.hitTest(_root.bst))){
чё делать в зависимости от объекта
}
ну и как тебе удобно снять флаг
andr_sky
02.07.2002, 21:44
to УильямБрэдберри Мастер Цифрового Облика:
я не понимаю зачем в каждый камень индекс.
у меня когда камень появляется то он делает:
_name = "e"+_root.en++;
_root.ej.push(_name);
//_root.en - счётчик врагов
//_root.ej - массив имён врагов (журнал типа)
таким образом в массиве будут содержаться уникальные имена
всех присутствующих на поле боя камней.
а пуля летит и постоянно смотрит это:
// пуля попала в мувик "e" (в нём все камни)
if (_parent.e.hitTest(_x, _y, 1)) {
// определяем в какой камень она попала
for (i=0; i<_root.ej.length; i++) {
bo = eval("_parent.e."+_root.ej[i]).hitTest(_x, _y, 1);
if (bo) {
// сказать камню что в него попала пуля
tellTarget ("_parent.e."+_root.ej[i]) {
call("hit");
}
}
}
// уничтожение пули ....
_parent.bn--;
gotoAndPlay(5);
}
а в камне лабел "hit":
// если здоровья хватает ещё
if (h>0) {
h--;
// мувик с итерфейсом камня
_.gotoAndStop(5-h);
} else {
// ЭТА ФУЕКЦИЯ УДАЛЯЕТ ЭЛЕМЕНТ ИЗ МАССИВА _ROOT.EJ
// *** ПЕРЕБОРОМ ***
_root.dfa(_name);
// функция создаёт потомков камня (осколки)
_parent.cr_e2(_x,_y);
removeMovieClip("");
}
влпщем как мне кажется всё сделано умно....
... кроме строчки с eval'ом... тут я парю чё то....
...можно сделать как то проще...
так вот мне бы надо как нить обойтись без *** ПЕРЕБОРОВ ***
это возможно?
to greyshaman
а зачем создавать этот bst?
можно использовать ту же самую пулю....
а твой вариант может получится наверное немножко тормознее.
когда будет _root.blast ВСЕ камни яро начнут проверять
свои hitTest'ы.
а у меня перебором можно остановить "break;" цикл когда он найдёт тот
самый камень, и сэкономить время на ненужном переборе остальных камней.
...только почему то я этого не сделал...
DeliMIter
02.07.2002, 23:21
Индекс в каждый камень чтобы каждый камень знал свое место, тогда если у нас есть "имя", то мы можем получить this["имя"].index место в массиве. Все так просто и естественно!
andr_sky
02.07.2002, 23:33
а по-моему дык не всё так просто и естестно....
ведь когда мы удалим имя камня из массива, то все индексы имен, стоящие после удалённого уменьшатся ровно на 1.
и после первого сбитого камня будут удаляться из массива имена не тех камней, которые будут сбиты на самом деле, т.к. Index будет врать....
я не прав?
andr_sky
02.07.2002, 23:37
.
УильямБрэдберри
02.07.2002, 23:43
Оригинал написал(а) andr_sky
...можно сделать как то проще...
так вот мне бы надо как нить обойтись без *** ПЕРЕБОРОВ ***
это возможно?
блин =)
да не храни ты массив из имен
а храни ссылки на объект
_name = "e"+_root.en++;
_root.ej.push(this);
будет проще управляться с ними
_name ---- это просто СВОЙСТВО объекта
andr_sky
03.07.2002, 00:00
Оригинал написал(а) УильямБрэдберри
блин =)
да не храни ты массив из имен
а храни ссылки на объект
_name = "e"+_root.en++;
_root.ej.push(this);
будет проще управляться с ними
_name ---- это просто СВОЙСТВО объекта
блин=)
я знаю что это свойство объекта.
только зачем ??????
итак всё просто.
все эти имена я знаю на 100 пудов что ни в муве _root.a.e
дык зачем это писать в каждый элемент массива???
только память загромождать.
УильямБрэдберри
03.07.2002, 00:09
кошшмар ;)
тут либо горшочек, либо дудочка
память нынче дешевая
лишние 3 кб не повредят
а массив из ссылок рулит
Nox Noctis
03.07.2002, 02:26
а рут и так является массивом из ссылок... так если все камни там - то нафиг дублировать :D
...что-то мне эта тема напоминает... из классики... точнее - из Льюиса Кэролла :) :p
andr_sky
03.07.2002, 09:06
Оригинал написал(а) Nox Noctis
а рут и так является массивом из ссылок... так если все камни там - то нафиг дублировать :D
дублировать что?
камни... дык как бы их много... он же не один там летает... один камень это не интересно....
..м
вопщем вы не можете придумать как заменить то второй перебор.... хы=) неудивительно .. раз уж я не смог =)))
--
всем спасибо за участие
DeliMIter
04.07.2002, 20:56
Мы твою задачу десять раз решили, но ты эти решения, к сожалению, не потянул. Спасибо Nox. Спасибо Уилл. :))))))))
andr_sky
04.07.2002, 23:11
ууууууу.... =)
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.