Самый быстрый способ удалить одну запись из середины массива()

Каков самый быстрый способ удалить одну конкретную запись из середины массива()

Массив большой, имеющий строки.

Я не хочу просто установить Array [5] = null, но вместо этого размер массива должен быть уменьшен на единицу, а массив [5] должен иметь содержимое массива [6] и т.д.

Ответ 1

У вас нет ориентиров для поддержки этого, но можно предположить, что собственный метод Array.splice будет самым быстрым...

Итак, чтобы удалить запись с индексом 5:

array.splice(5, 1);

Ответ 2

Если вы не заботитесь о порядке элементов в массиве (но просто хотите, чтобы он был 1 короче), вы можете скопировать последний элемент массива в индекс, который нужно удалить, затем вынуть последний элемент.

array[index] = array[array.length-1];
array.pop();

Я бы предположил, что это быстрее, процессорное время, если вы можете избавиться от переупорядочения массива.

РЕДАКТИРОВАТЬ: вам следует ориентироваться на конкретный случай; Недавно я это сделал, и быстрее было просто сращиваться. (Предположительно, поскольку Chrome фактически не хранит массив в виде единого непрерывного буфера.)

Ответ 3

Array.splice() "добавляет элементы и удаляет элементы из массива":

myArr.splice(indexToRemove, 1); // only removing one index, thus the 1

Ответ 4

Я протестировал 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/

Ответ 5

В зависимости от вашего случая вы можете использовать словарь вместо массива, если хотите определить приоритетность производительности.

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];