2009-03-26 2 views
0

Как удалить элементы из массива, связанного с данными? Далее следует мой код.Удаление элементов из привязанного к данным массива

for(var i = 0; i < listBox.selectedIndices.length; i++) { 
    var toRemove = listFiles.selectedIndices[i]; 
    dataArray.splice(toRemove, 1); 
} 

Заранее благодарен!

Редактировать Вот мой swf. Действие «Добавить фотографии» выполняется, только если вы удаляете элементы. http://www.3rdshooter.com/Content/Flash/PhotoUploader.html

  1. Добавить 3 фотографии разные.
  2. Удалить вторую фотографию.
  3. Добавить другое фото.
  4. SWF добавляет вторую фотографию в конец.

Любые идеи о том, почему это будет сделано?

Edit 2 Вот мой код

private function OnSelectFileRefList(e:Event):void 
{ 
    Alert.show('addstart:' + arrayQueue.length); 
    for each (var f:FileReference in fileRefList.fileList) 
    { 
     var lid:ListItemData = new ListItemData(); 
     lid.fileRef = f; 
     arrayQueue[arrayQueue.length]=lid; 
    } 
    Alert.show('addcomplete:' + arrayQueue.length); 
    listFiles.executeBindings(); 
    Alert.show(ListItemData(arrayQueue[arrayQueue.length-1]).fileRef.name); 
    PushStatus('Added ' + fileRefList.fileList.length.toString() + ' photo(s) to queue!'); 
    fileRefList.fileList.length = 0; 
    buttonUpload.enabled = (arrayQueue.length > 0); 
} 

private function OnButtonRemoveClicked(e:Event):void 
{ 
    for(var i:Number = 0; i < listFiles.selectedIndices.length; i++) { 
     var toRemove:Number = listFiles.selectedIndices[i]; 
     //Alert.show(toRemove.toString()); 
     arrayQueue.splice(toRemove, 1); 
    } 
    listFiles.executeBindings(); 
    Alert.show('removecomplete:' + arrayQueue.length); 
    PushStatus('Removed photos from queue.'); 
    buttonRemove.enabled = (listFiles.selectedItems.length > 0); 
    buttonUpload.enabled = (arrayQueue.length > 0); 
} 
+0

Что случилось с код, который вы используете? Не работает ли «сращивание» для вас? – James

+0

Кажется, нет. Когда я добавляю другой элемент в список, я получаю предыдущий элемент. –

+1

Обновлено мой ответ –

ответ

2

Это, несомненно, будет полезно знать две вещи:

  1. Какая версия ActionScript вы ориентацию?

  2. Судя по поведению приложения, ошибка возникает, когда пользователь удаляет элемент из списка файлов для загрузки. Выглядит больше как проблема с вашей логикой, когда пользователь добавляет новый элемент в список. Вы могли бы также опубликовать этот код?

UPDATE:

Вместо: arrayQueue[arrayQueue.length]=lid

Try: arrayQueue.push(lid)

Это добавит новый элемент в конец массива и нажмите пункт, чтобы это место ,

UPDATE 2:

Хорошо, сделал немного больше рыть. Оказывается, файлList не очищается каждый раз, когда открывается диалог (если вы не создаете новый экземпляр FileReferenceList каждый раз, когда пользователь выбирает новые файлы). Вы должны вызвать splice() в файлеList после того, как вы добавите каждый файл в свой массив.

Попробуйте что-нибудь подобное в методе AddFile() ...

for(var j:int=0; j < fileRefList.fileList.length; j++) 
{ 
    arrayQueue.push(fileRefList.fileList[j]); 
    fileRefList.fileList.splice(j, 1); 
} 

Это позволит сохранить список файлов в актуальном состоянии, а не удерживать предыдущие выборы.

+0

Я добавил свой код, его AS3 –

+0

Ответ обновлен ... –

+0

обновление: без изменений. –

0

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

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

0

Вы хотите использовать listBox и listFiles для обозначения того же?

Я выхожу на конечность здесь, потому что у меня нет большого опыта работы с JavaScript, но я бы сделал это так же, как и в C, C++ или Java: Скопировав оставшиеся элементы массива в их новые местоположения.

Предполагая, что listFiles.selectedIndices сортируется (и его содержимое являются допустимыми индексами для DataArray), код будет нечто вроде следующего:

(ВНИМАНИЕ:. Непроверенный код следует)

// Don't bother copying any elements below the first selected element. 
var writeIndex = listFiles.selectedIndices[0]; 
var readIndex = listFiles.selectedIndices[0] + 1; 
var selectionIndex = 1; 
while(writeIndex < (dataArray.length - listFiles.selectedIndices.length)) { 
    if (selectionIndex < listFiles.selectedIndices.length) { 
    // If the read pointer is currently at a selected element, 
    // then bump it up until it's past selected range. 
    while(selectionIndex < listFiles.selectedIndices.length && 
      readIndex == listFiles.selectedIndices[selectionIndex]) { 
     selectionIndex++; 
     readIndex++; 
    } 
    } 
    dataArray[writeIndex++] = dataArray[readIndex++]; 
} 

// Remove the tail of the dataArray 
if (writeIndex < dataArray.length) { 
    dataArray.splice(writeIndex, dataArray.length - writeIndex); 
} 

EDIT 2009/04/04: Ваш алгоритм удаления по-прежнему страдает из-за того, что при удалении элементов в listFiles.selectedIndices вы нарушаете соответствие между индексами в arrayQueue и в listFiles.selectedIndices.

Чтобы увидеть это, попробуйте добавить 3 файла, а затем нажмите «Выбрать все», а затем нажмите «Удалить». Он начнется с удаления первого файла в списке (индекс 0). Теперь, что было, 2-й и 3-й файлы в списке указаны с индексами 0 и 1. Следующее значение, взятое из listFiles.selectedIndices, равно 1, - но теперь, что было в файле 3rd, указана в индексе 1. Таким образом, первый Файл №3 получает сплайсинг из массива, оставляя прежний 2-й файл без удаления и индексом 0. (Используя больше файлов, вы увидите, что эта реализация удаляет только все файлы в массиве.)

Это почему мой код JavaScript (см. выше) использует readIndex и writeIndex для копирования записей в массиве, пропуская readIndex по индексам, которые необходимо удалить. Этот алгоритм позволяет избежать проблемы потери соответствия между индексами массива. (Он должен быть тщательно закодирован для защиты от различных краевых условий.) Я пробовал код JavaScript , аналогичный тем, что я написал выше; это сработало для меня.

Я подозреваю, что проблема в исходном тестовом примере (удаление второго файла, а затем добавление другого) аналогична. Поскольку вы только показывали часть своего кода, я не могу сказать, будут ли индексы массива и данные в listFiles.selectedIndices, arrayQueue и fileRefList.fileList всегда соответствовать соответствующим образом. (Но я подозреваю, что проблема в том, что они не делают.)

Кстати, даже если вы решить эту проблему с помощью splice() путем корректировки значений индексов массива соответствующим образом, это все еще O (N) алгоритм общий случай. Алгоритм копирования массива - O (N).

-2

Возможно, вас заинтересует этот blog entry о том, что на языке Java отсутствуют надежные итераторы.

Язык программирования, который вы упомянули в Javascript, не является проблемой, это концепция надежных итераторов, которые я хотел бы указать (на самом деле речь идет о C++ в качестве языка программирования).

[исследовательский документ]() о предоставлении надежных итераторов для платформы ET ++ C++ может помочь в решении вашей проблемы. Я уверен, что документ может предоставить вам необходимые идеи, как подойти к вашей проблеме.

+0

Умм, это JavaScript/EcmaScript/ActionScript, а не java. –

+0

Я не знаю почему, но я не могу получить уценку делать то, что хочу :-( – lothar

0

Мне действительно нужно увидеть весь класс, чтобы дать ответ, но я бы написал метод обработки нескольких объектов из dataProvider и, возможно, назначил новый массив как dataProvider для списка вместо того, чтобы играть с привязка и использование одного и того же списка в течение продолжительности. Как я уже сказал, это, вероятно, неэффективна и требует взглянуть на контекст вопроса, но это то, что я хотел бы сделать 9unless у вас есть большая потребность связывания в этом обстоятельстве)

/** 
* Returns a new Array with the selected objects removed 
*/ 
private function removeSelected(selectedItems:Array):Array 
{ 
    var returnArray:Array = [] 
    for each(var object:Object in this.arrayQueue) 
    { 
     if(selectedItems.indexOf(object)==-1) 
      returnArray.push(object) 
    } 
    return returnArray; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^