Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 13.01.2023, 18:40
Аватар для Bonky
Новичок на форуме
Отправить личное сообщение для Bonky Посмотреть профиль Найти все сообщения от Bonky
 
Регистрация: 13.01.2023
Сообщений: 6

Использование in-place функций для массивов
На сайте с уроками попалась задача, нужно создать функцию, которая отсортирует элементы массива, оставив только уникальные:

let strings = ["кришна", "кришна", "харе", "харе",
  "харе", "харе", "кришна", "кришна", ":-O"
];

alert( unique(strings) ); // кришна, харе, :-O


Вот мое решение при помощи in place функций:
function unique(arr) {
    arr.sort();

      for (let i = 0; i < arr.length; ) {
          if (arr[i] === arr[i + 1]) {
              arr.splice(i, 1);
              continue;
          }
          i++;
      }

      return arr;
  }


А вот решение из учебника:
function unique(arr) {
  let result = [];

  for (let str of arr) {
    if (!result.includes(str)) {
      result.push(str);
    }
  }

  return result;
}


Вопрос: какое из решений является более экономным по ресурсам? Помогает ли в моем случае использование in place функций сделать алгоритм эффективнее?
Ответить с цитированием
  #2 (permalink)  
Старый 13.01.2023, 18:49
Аватар для Bonky
Новичок на форуме
Отправить личное сообщение для Bonky Посмотреть профиль Найти все сообщения от Bonky
 
Регистрация: 13.01.2023
Сообщений: 6

Сообщение от Rise Посмотреть сообщение
Что это значит?
Метод, который меняет массив, не создавая новый
Ответить с цитированием
  #3 (permalink)  
Старый 13.01.2023, 19:09
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 458

Bonky,
Понятно.

Сообщение от Bonky
попалась задача
Старая задача наверно. Сегодня это можно делать так:
let strings = ["кришна", "кришна", "харе", "харе",
  "харе", "харе", "кришна", "кришна", ":-O"
];
 
alert([...new Set(strings)]); // кришна, харе, :-O

Последний раз редактировалось Rise, 13.01.2023 в 19:16.
Ответить с цитированием
  #4 (permalink)  
Старый 13.01.2023, 19:11
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,123

Bonky,
обсуждалось не раз, push "экономнее" splice.
Ответить с цитированием
  #5 (permalink)  
Старый 13.01.2023, 19:13
Аватар для Bonky
Новичок на форуме
Отправить личное сообщение для Bonky Посмотреть профиль Найти все сообщения от Bonky
 
Регистрация: 13.01.2023
Сообщений: 6

Сообщение от рони Посмотреть сообщение
Bonky,
обсуждалось не раз, push "экономнее" splice.
Понятно, спасибо!
Ответить с цитированием
  #6 (permalink)  
Старый 13.01.2023, 21:00
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

Сообщение от Bonky
какое из решений является более экономным по ресурсам?
Оба решения так себе, работают за O(n^2). То которое из учебника, лучше переписать как Rise советовал. Твой вариант можно ускорить, если не пользоваться сплайсом:
function unique(arr) {
    arr.sort();
    let p = 0;

    for (let i = 1; i < arr.length; ++i) {
        if (arr[i] !== arr[p]) {
            p++;
            arr[p] = arr[i];
        }
    }

    arr.length = p + 1;
}


Это на случай, когда надо именно пофильтровать переданный массив, а не создать новый. Но такое редко бывает.
Ответить с цитированием
  #7 (permalink)  
Старый 13.01.2023, 21:08
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,750

Сообщение от рони
обсуждалось не раз, push "экономнее" splice.
push то быстрее splice
А вот что быстрее push + includes или splice - это еще надо выяснять.
Ответить с цитированием
  #8 (permalink)  
Старый 14.01.2023, 02:58
Аватар для Bonky
Новичок на форуме
Отправить личное сообщение для Bonky Посмотреть профиль Найти все сообщения от Bonky
 
Регистрация: 13.01.2023
Сообщений: 6

Сообщение от Alexandroppolus Посмотреть сообщение
Это на случай, когда надо именно пофильтровать переданный массив, а не создать новый. Но такое редко бывает.
Ух, классное решение, спасибо!
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Использование window.open() для позиционирования окна в середине экрана marat-chessman Events/DOM/Window 13 14.08.2011 20:20
Использование Ajax для динамического обновления содержимого Rifmasta AJAX и COMET 0 10.07.2009 15:39
Можно ли как для произвольного массива создавать вызовы функций , имеющих на входе kefi Общие вопросы Javascript 3 17.04.2009 16:53