Вы хотите использовать 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);
}
РЕДАКТИРОВАТЬ 2009/04/04: Ваш алгоритм удаления по-прежнему страдает недостатком, заключающимся в том, что при удалении элементов в listFiles.selectedIndices
вы нарушаете соответствие между индексами в arrayQueue
и индексами в listFiles.selectedIndices
.
Чтобы увидеть это, попробуйте добавить 3 файла, затем выполните «Выбрать все» и нажмите «Удалить». Это начнется с удаления первого файла в списке (индекс 0). Теперь то, что было , 2-й и 3-й файлы в списке имеют индексы 0 и 1. Следующее значение, взятое из listFiles.selectedIndices
, равно 1 - но теперь, что было 3-м файл с индексом 1. Таким образом, предыдущий Файл № 3 выделяется из массива, оставляя прежний 2-й файл без удаления и с индексом 0. (Используя больше файлов, вы увидите, что эта реализация удаляет только все остальные файлы в массиве.)
Вот почему мой код JavaScript (выше) использует readIndex
и writeIndex
для копирования записей в массиве, пропуская readIndex
по индексам, которые должны быть удалены. Этот алгоритм позволяет избежать проблемы потери соответствия между индексами массива. (Его нужно тщательно кодировать, чтобы защититься от различных краевых условий.) Я попробовал код JavaScript , аналогичный , который я написал выше; у меня это сработало.
Я подозреваю, что проблема в вашем исходном тестовом примере (удаление второго файла, а затем добавление другого) аналогична. Поскольку вы показали только часть своего кода, я не могу сказать, будут ли индексы массивов и данные в listFiles.selectedIndices
, arrayQueue
и fileRefList.fileList
всегда соответствовать друг другу. (Но я подозреваю, что проблема в том, что они этого не делают.)
Кстати, даже если вы решите проблему с помощью splice()
, настроив значения индекса массива соответствующим образом, это все равно алгоритм O (N 2 ) в общем случае. Алгоритм копирования массива O (N).