Самый быстрый способ удалить одну запись из середины массива () - PullRequest
21 голосов
/ 12 марта 2009

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

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

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

Ответы [ 5 ]

51 голосов
/ 12 марта 2009

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

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

array.splice(5, 1);
24 голосов
/ 12 марта 2009

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

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

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

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

3 голосов
/ 04 апреля 2013

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

3 голосов
/ 12 марта 2009

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

myArr.splice(indexToRemove, 1); // only removing one index, thus the 1
1 голос
/ 13 марта 2009

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

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