2.4. Снова оцениваем сложности функций

В первом разделе мы уже оценивали сложности функций, но на примере из жизни. Давайте повторим то же самое, только уже с настоящим кодом!

1. Оцените алгоритмическую сложность следующей функции для складывания значений из объекта в массив в мире, где нет Object.values():
function getValues(object) {
  return Object.keys(object).reduce((arr, key) => [...arr, key], []);
}
2. А за сколько отработал бы встроенный Object.values()?
3. Насколько сложна эта функция «разворота» массива?
function reverse(array) {
  const reversed = [];

  for (let i = array.length - 1; i >= 0; i--) {
    reversed.push(array[i]);
  }

  return reversed;
}
4. А такая?
function reverse(array) {
  const reversed = [];

  array.forEach(element => reversed.unshift(element))

  return reversed;
}
5. Какая сложность у такого избавления от дубликатов в массиве? (Код, видимо, писал Игорь из прошлого раздела...)
function reverse(array) {
  let unique;

  for (let i = 0; i < array.length; i++) {
    const index = array.indexOf(element);

    if (index === i) {
      unique.unshift(element);
    }
  }

  unique.reverse();

  return unique;
}
6. С помощью какой или каких структур данных можно сделать это быстрее всего?