БлогNot. Функция array_unique на Javascript?

Функция 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 [2215 просмотров]


теги: javascript время тест браузеры

К этой статье пока нет комментариев, Ваш будет первым