Функция array_unique на Javascript?
В яваскрипте нет готовой функции вроде array_unique из PHP, оставляющей в массиве только уникальные элементы. Вроде бы, несложно написать такое "в лоб":
function unique(arr) { let result = []; for (let str of arr) { if (!result.includes(str)) result.push(str); } return result; }
Но includes
- это полный проход по массиву, таким образом, получается временная сложность O(N2)
, да и выглядит код страшновато.
Куда лучше так, с применением встроенного в язык Set:
function unique (arr) { return Array.from(new Set(arr)); }
Протестируем оба кода таким образом:
Файл 1.html
<script> function unique(arr) { let result = []; for (let str of arr) { if (!result.includes(str)) result.push(str); } return result; } var arr = []; for (var i = 0; i < 10000; i++) arr.push(i%100); console.time('1'); arr = unique(arr); console.timeEnd('1'); </script>
Файл 2.html
<script> function unique (arr) { return Array.from(new Set(arr)); } var arr = []; for (var i = 0; i < 10000; i++) arr.push(i%100); console.time('2'); arr=unique(arr); console.timeEnd('2'); </script>
Второй код почти в 10 раз быстрее.
Чтобы увидеть, что JavaScript выводит в консоль, нажмите комбинацию клавиш, зависящую от браузера (имеются в виду новые версии всех браузеров):
Ctrl + Shift + J
в Google Chrome и Opera;Ctrl + Shift + K
в Firefox;F12
в Internet Explorer (в версии 11 ещё не работают "let str of
" и "Array.from
")
Кстати, заодно можете и время выполнения в разных браузерах сравнить.
P.S. Если под "уникальностью" понимать не исключение повторов значений элементов в массиве, а "элементы, встречающиеся в массиве строго один раз", расчёт, конечно, меняется и в простейшем случае будет выглядеть примерно так:
<script> function unique (arr) { let arr2 = []; for (let val of arr) { let n = arr.filter(function(x){return x==val}).length; if (n == 1) arr2.push (val); } return arr2; } let arr = [1, 2, 2, 3, 1, 4, 5, 2, 6]; console.log (unique (arr)); //[3, 4, 5, 6] </script>
11.11.2019, 15:01 [2338 просмотров]