Ответ 1
У вас нет ориентиров для поддержки этого, но можно предположить, что собственный метод Array.splice будет самым быстрым...
Итак, чтобы удалить запись с индексом 5:
array.splice(5, 1);
Каков самый быстрый способ удалить одну конкретную запись из середины массива()
Массив большой, имеющий строки.
Я не хочу просто установить Array [5] = null, но вместо этого размер массива должен быть уменьшен на единицу, а массив [5] должен иметь содержимое массива [6] и т.д.
У вас нет ориентиров для поддержки этого, но можно предположить, что собственный метод Array.splice будет самым быстрым...
Итак, чтобы удалить запись с индексом 5:
array.splice(5, 1);
Если вы не заботитесь о порядке элементов в массиве (но просто хотите, чтобы он был 1 короче), вы можете скопировать последний элемент массива в индекс, который нужно удалить, затем вынуть последний элемент.
array[index] = array[array.length-1];
array.pop();
Я бы предположил, что это быстрее, процессорное время, если вы можете избавиться от переупорядочения массива.
РЕДАКТИРОВАТЬ: вам следует ориентироваться на конкретный случай; Недавно я это сделал, и быстрее было просто сращиваться. (Предположительно, поскольку Chrome фактически не хранит массив в виде единого непрерывного буфера.)
Array.splice() "добавляет элементы и удаляет элементы из массива":
myArr.splice(indexToRemove, 1); // only removing one index, thus the 1
Я протестировал Array.prototype.splice() и обнаружил, что он очень медленный на больших массивах.
Более быстрый способ удаления элементов состоит в том, чтобы скопировать те, которые вы хотите сохранить в новый массив, и пропустить те, которые вы хотите удалить. После того, как вы закончили копирование, вы просто переопределите старый массив с новым.
В моем тесте я удалил все остальные элементы из массива, содержащего 100 000 элементов. Тест сравнивал Array.prototype.splice() с другими методами. Вот результаты:
855 ms = splice
7 ms = manual copying without preserving the original array
14 ms = manual copying with preserving the original array
Здесь код для последнего метода:
var arrB = [],
i=varA.length,
j=0;
// copy even items to a new array
while(i > 0) {
i-=2; // skip two elements
arrB[j++] = arrA[i];
}
// clear the old array
arrA.splice(0, arrA.length);
// copy values back to the old array
// array is preserved (references to the array don't need to be updated)
arrA.push.apply(arrA, arrB);
Тест в действии можно найти на jsFiddle: http://jsfiddle.net/sansegot/eXvgb/3/
Результаты очень разные, если вам нужно только удалить несколько элементов - в таких случаях Array.prototype.splice() быстрее (хотя разница не такая большая)! Только если вам нужно много раз вызывать splice(), то стоит реализовать собственный алгоритм. Второй тест, в котором необходимо удалить ограниченное число элементов, можно найти здесь: http://jsfiddle.net/sansegot/ZeEFJ/1/
В зависимости от вашего случая вы можете использовать словарь вместо массива, если хотите определить приоритетность производительности.
var dict:Dictionary = new Dictionary();
// The following value/key set should be customized so you can
// get use of them in your specific case.
dict[item1] = item1;
dict[item2] = item2;
...
delete dict[item1];