CHỈ CÓ HIỆU SUẤT! mã này có thể nhanh hơn 10 lần so với tất cả các mã ở đây * hoạt động trên tất cả các trình duyệt và cũng có tác động bộ nhớ thấp nhất .... và hơn thế nữa
nếu bạn không cần sử dụng lại mảng cũ, btw thực hiện các thao tác cần thiết khác trước khi bạn chuyển đổi nó thành duy nhất ở đây có lẽ là cách nhanh nhất để làm điều này, cũng rất ngắn.
var array=[1,2,3,4,5,6,7,8,9,0,1,2,1];
sau đó bạn có thể thử điều này
var array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 1];
function toUnique(a, b, c) { //array,placeholder,placeholder
b = a.length;
while (c = --b)
while (c--) a[b] !== a[c] || a.splice(c, 1);
return a // not needed ;)
}
console.log(toUnique(array));
//[3, 4, 5, 6, 7, 8, 9, 0, 2, 1]
Tôi đã đưa ra chức năng này khi đọc bài viết này ...
http://www.shamocation.net/2009/09/fast-alerskym-to-find-unique-items-in-javascript-array/
Tôi không thích vòng lặp for. nó có nhiều tham số. tôi thích vòng lặp while--. trong khi đó là vòng lặp nhanh nhất trong tất cả các trình duyệt ngoại trừ trình duyệt mà tất cả chúng ta đều rất thích ... chrome.
dù sao tôi đã viết hàm đầu tiên sử dụng while. Và vâng, nó nhanh hơn một chút so với hàm tìm thấy trong bài viết. Nhưng không đủ.unique2()
Bước tiếp theo sử dụng js hiện đại. Object.keys
tôi đã thay thế vòng lặp khác bằng Object.keys của js1.7 ... nhanh hơn và ngắn hơn một chút (trong chrome 2x nhanh hơn);). Không đủ!. unique3()
.
tại thời điểm này tôi đã suy nghĩ về những gì tôi thực sự cần trong chức năng độc đáo của tôi. Tôi không cần mảng cũ, tôi muốn một chức năng nhanh. Vì vậy, tôi đã sử dụng 2 trong khi vòng lặp + mối nối.unique4()
Vô dụng để nói rằng tôi đã rất ấn tượng.
trình duyệt Chrome: 150.000 hoạt động thông thường mỗi giây đã nhảy vọt lên 1.800.000 hoạt động mỗi giây.
tức là: 80.000 op / s so với 3.500.000 op / s
ios: 18.000 op / s so với 170.000 op / s
safari: 80.000 op / s so với 6.000.000 op / s
Bằng chứng
http://jsperf.com/wgu hoặc tốt hơn là sử dụng console.time ... microtime ... bất cứ điều gì
unique5()
chỉ để cho bạn thấy những gì xảy ra nếu bạn muốn giữ mảng cũ.
Đừng sử dụng Array.prototype
nếu bạn không biết bạn đang làm gì. tôi chỉ làm rất nhiều bản sao và quá khứ. Sử dụng Object.defineProperty(Array.prototype,...,writable:false,enumerable:false})
nếu bạn muốn tạo một nguyên mẫu gốc. Ví dụ: https://stackoverflow.com/a/20463021/2450730
Bản giới thiệu
http://jsfiddle.net/46S7g/
LƯU Ý: mảng cũ của bạn bị hủy / becomestheunique sau thao tác này.
nếu bạn không thể đọc mã ở trên, hãy đọc một cuốn sách javascript hoặc đây là một số giải thích về mã ngắn hơn. https://stackoverflow.com/a/21353032/2450730
một số đang sử dụng indexOf
... đừng ... http://jsperf.com/dgfgghfghfghghgfhgfhfghfhgfh
cho mảng trống
!array.length||toUnique(array);