ТОЛЬКО ЭФФЕКТИВНОСТЬ! этот код, вероятно, в 10 раз быстрее, чем все приведенные здесь коды *, работает во всех браузерах и также имеет минимальное влияние на память ....
и больше
если вам не нужно повторно использовать старый массив, кстати, выполните другие необходимые операции, прежде чем преобразовать его в уникальный, здесь, вероятно, самый быстрый способ сделать это, также очень короткий.
var array=[1,2,3,4,5,6,7,8,9,0,1,2,1];
тогда вы можете попробовать это
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]
Я придумал эту функцию, читая эту статью ...
http://www.shamasis.net/2009/09/fast-algorithm-to-find-unique-items-in-javascript-array/
Мне не нравится цикл for. он имеет много параметров. Мне нравится цикл while--.
while - самый быстрый цикл во всех браузерах, кроме того, который нам всем так нравится ... chrome.
Во всяком случае, я написал первую функцию, которая использует while. И да, это немного быстрее, чем функция, найденная в статье. Но недостаточно. unique2()
следующий шаг использовать современные JS. Object.keys
я заменил другой цикл for на js1.7 Object.keys ...
немного быстрее и короче (в хроме в 2 раза быстрее);). Не достаточно!. unique3()
.
В этот момент я думал о том, что мне действительно нужно в МОЕЙ уникальной функции.
мне не нужен старый массив, я хочу быструю функцию.
так что я использовал 2 в то время как петли + сплайс. unique4()
Бесполезно говорить, что я был впечатлен.
chrome: обычные 150 000 операций в секунду подскочили до 1 800 000 операций в секунду.
т.е.: 80 000 операций / с против 3 500 000 операций / с
ios: 18 000 операций / с против 170 000 операций / с
сафари: 80 000 операций / с против 6 000 000 операций / с
Доказательство
http://jsperf.com/wgu или лучше использовать console.time ... microtime ... что угодно
unique5()
просто показывает вам, что происходит, если вы хотите сохранить старый массив.
Не используйте Array.prototype
, если вы не знаете, что делаете.
Я только что сделал много копий и прошлого.
Используйте Object.defineProperty(Array.prototype,...,writable:false,enumerable:false})
, если вы хотите создать собственный prototype.example: https://stackoverflow.com/a/20463021/2450730
Демо
http://jsfiddle.net/46S7g/
ПРИМЕЧАНИЕ: ваш старый массив после этой операции уничтожается / становится уникальным.
если вы не можете прочитать приведенный выше код, спросите, прочитайте книгу по javascript или вот несколько объяснений более короткого кода. https://stackoverflow.com/a/21353032/2450730
некоторые используют indexOf
... не ... http://jsperf.com/dgfgghfghfghghgfhgfhfghfhgfh
для пустых массивов
!array.length||toUnique(array);