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