Tôi đã thử nghiệm Array.prototype.splice() và thấy rằng nó rất chậm trên mảng lớn.
Cách xóa phần tử nhanh hơn nhiều là sao chép các phần tử bạn muốn giữ lại một mảng mới, trong khi bỏ qua các phần tử bạn muốn xóa. Sau khi sao chép xong, bạn chỉ cần ghi đè lên mảng cũ bằng mảng mới.
Trong thử nghiệm của tôi, tôi đã xóa mọi phần tử khác khỏi một mảng chứa 100.000 mục. Phép thử đã so sánh Array.prototype.splice() với các phương thức khác. Dưới đây là kết quả:
855 ms = splice
7 ms = manual copying without preserving the original array
14 ms = manual copying with preserving the original array
Dưới đây là các mã cho phương pháp cuối cùng:
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);
Các thử nghiệm trong hành động có thể được tìm thấy trên jsFiddle: http://jsfiddle.net/sansegot/eXvgb/3/
Kết quả là khác nhiều so với khi bạn chỉ cần phải loại bỏ một vài mục - trong trường hợp này Array.prototype.splice() là nhanh hơn (mặc dù sự khác biệt không quá lớn)! Chỉ khi bạn cần phải gọi splice() nhiều lần nó có giá trị nó để thực hiện thuật toán tùy chỉnh. Thử nghiệm thứ hai, trong đó một số lượng hạn chế các thành phần cần xóa có thể được tìm thấy tại đây: http://jsfiddle.net/sansegot/ZeEFJ/1/
Nguồn
2013-04-04 14:14:28
splice() thực sự là cách để đi, nhưng hãy nhớ rằng việc loại bỏ mọi thứ ở giữa sẽ chậm với các mảng lớn vì flash sẽ "di chuyển" các mục sau để lấp đầy khoảng trống. – grapefrukt
Cũng lưu ý rằng việc xóa mọi thứ ở giữa một mảng trong khi chạy qua nó sẽ tàn phá trừ khi bạn đang chạy ngược. – Sean
Lưu ý rằng điều này cũng sẽ làm việc cho JavaScript. – Grinn