How to remove duplicates from an array? Three ways. (JavaScript)

Поділитися
Вставка
  • Опубліковано 17 лют 2019
  • В этом видео вы узнаете 3 способа удаления дубликатов из массива в JS - как сделать так, чтобы остались только уникальные элементы.
    --
    Решение с reduce: codepen.io/puzankov/pen/zeMrbN
    Документация:
    - Set: developer.mozilla.org/en-US/d...
    - Array includes: developer.mozilla.org/en-US/d...
    - Array indexOf: developer.mozilla.org/en-US/d...
    - Array filter: developer.mozilla.org/en-US/d...
    - Array reduce: developer.mozilla.org/en-US/d...
    --
    Задавайте ваши вопросы в комментариях. А также пишите, на какие темы вам хотелось бы увидеть новые выпуски.
    Если видео было для вас полезным, ставьте лайк и поделитесь им с друзьями.
    ---
    Подписывайтесь на наш канал: bit.ly/fs-ytb
    ---
    Присоединяйтесь к нам в соцсетях:
    FB: / frontendscience
    Telegram: t.me/frontend_science
    Instagram Сергея Пузанкова: / puzankovcom
    Заходите на наш сайт: frontend-science.com/

КОМЕНТАРІ • 54

  • @olgabutsik6632
    @olgabutsik6632 Рік тому +3

    Очень много спасибо!!!! Я учусь на Ваших видео . Пожалуйста не останавливайся. Всё у вас просто и понятно. Мне нужно срочно выучить мой любимый JavaScript!!!

  • @user-ls4vs9uo5k
    @user-ls4vs9uo5k 11 місяців тому

    Спасибо за такие прекрасные обучающие видео, все просто и понятно, без лишней воды!

  • @sergeiosokin300
    @sergeiosokin300 4 роки тому +7

    Шикарное объяснение! Спасибо! И отдельное спасибо за рассмотрение разных способов.

    • @frontendscience
      @frontendscience  4 роки тому

      Спасибо за поддержку! рады стараться :)

    • @awenn2015
      @awenn2015 4 роки тому +1

      @@frontendscience привет, у меня вопрос а как можно фильтровать элементы на уникальность при пуше? Пример, у меня есть форма подписки на емаил рассылку при отправлении формы я проверяю есть ли данный емаил в массиве и если есть возвращая ошибку мол эта почта уже подписана на рассылку, вчера сидел часа три ничего в голову не прошло, дали опыта мало в js по-хорошему это все на бэкенде надо хранить в базе данных так как при обновлении страницы все это слетит, но для начала хотя бы такую проверку сделать бы, спасибо заранее)

    • @smashno
      @smashno 4 роки тому +1

      @@awenn2015 Если нужно проверить пачку email'ов существуют ли они уже в системе я бы использовал один из двух вариантов: либо создать объект в котором ключами будут email'ы, либо сделать new Set() и после этого можно очень быстро проверять есть ли такой email уже или нет. Если нету то добавлять.

  • @Albert_Hall
    @Albert_Hall Рік тому +1

    Реализация - Пушка!! Один способ краше другого!🚀🌠

  • @dimageorgiev5798
    @dimageorgiev5798 5 років тому +8

    Благодарность !

  • @okelove9807
    @okelove9807 Місяць тому

    Очень круто спасибо.❤

  • @Maryfeb1
    @Maryfeb1 2 роки тому +1

    Спасибо большое за ваш труд!)

    • @frontendscience
      @frontendscience  2 роки тому +1

      Спасибо, Мария, за поддержку! Рады, что Вам нравится наш контент)

  • @lilitvardanyan2275
    @lilitvardanyan2275 Рік тому

    Спасибо большое.

  • @alexandrsachishin962
    @alexandrsachishin962 2 роки тому

    привет! для п. 2 есть небольшое дополнение: фильтр, как и многие методы массива, принимает 3 параметром (редюс 4) сам исходный массив. в ретурн можно его прописать, потому что если я захочу поменять название своего массива, это придется делать 3 местах: инициализация, фильтр и тело функции фильтрации
    для п.3 можно сделать больше строчек кода, но меньшую сложность алгоритма через обычный объект и фильтр / Object.keys

  • @hrd_wrk2073
    @hrd_wrk2073 Рік тому +1

    Если в варианте с reduce() использовать push() для добавления нового элемента, то в последующих итерации метод includes() работать не будет так как колбэком будет число

  • @user-jc8sf2ju2h
    @user-jc8sf2ju2h 2 роки тому

    Ничего себе...
    Interface Set
    Since: 1.2
    December 1998
    Вау...Продолжайте парни )))

  • @ruslannykyforov5740
    @ruslannykyforov5740 5 років тому +19

    Довольно нативное решение для JS через уникальность ключей в объекте
    const array = ['a','b','c','a','b'];
    let temp = {};
    array.forEach((item, i) => temp[item] = i);
    Object.keys(temp);

    • @smashno
      @smashno 5 років тому +3

      Да это тоже клевое решение. Я раньше часто использовал такой подход.

    • @kawaikaino5277
      @kawaikaino5277 5 років тому +1

      Почему объект по итогу {a: 3, b: 4, c: 2}, а не {a: 0, b: 1, c:2 }

    • @kawaikaino5277
      @kawaikaino5277 5 років тому +1

      А, все - он переписал в цикле, хитро

    • @smashno
      @smashno 5 років тому +6

      @@kawaikaino5277 Потому что когда итератор дойдет до второй "а" у которой индекс 3, он перетрет значение свойства "а" в объекте (которое уже будет выставлено в 0). Но самое главное - все равно что записано будет в качестве значения в объекте. Для решения этой задачи важны только сами ключи в объекте. Благодаря Object.keys(temp); - все имена ключей превратятся в новый массив уникальных.

  • @dimamashensky6870
    @dimamashensky6870 2 роки тому

    Good )

  • @Ahmedhkad
    @Ahmedhkad 10 місяців тому

    А вообще почему использовать массывы? В чем объект {} проблемы?

  • @pavelkoltsov1548
    @pavelkoltsov1548 3 роки тому

    Спасибо за подробное объяснение!) А есть "нерегистрочувствительный" способ для элементов массива?) Иными словами: есть исходный массив ["asd", "ASD", "Asd", "bcd"], но на выходе должны получить только ["asd", "bcd"]
    Заранее спасибо)

    • @frontendscience
      @frontendscience  3 роки тому +3

      Ну так как на выходе по умолчанию мы получаем все только в нижнем регистре то тут все просто выйдет:
      const uniqArray = array.reduce((uniq, item) => {
      item = item.toLoverCase(); //Добавляем приведение к нижнему регистру и все.
      return uniq.includes(item) ? uniq : [...uniq, item];
      }, [])

    • @pavelkoltsov1548
      @pavelkoltsov1548 3 роки тому

      @@frontendscience Спасибо большое!)

    • @maksimus.ssirotkin1124
      @maksimus.ssirotkin1124 2 місяці тому

      А сложность какая и затраты?

  • @nikitadenisov9546
    @nikitadenisov9546 Рік тому

    а если есть массив объектов, где нужно получить массив уникальных объектов

  • @ivanmikhailovich1963
    @ivanmikhailovich1963 3 роки тому

    А не можете помочь розобраться как изменить объект в массиве??
    Т.е. есть функция с объектом которая принимает значение трёх inputov..
    const arr= []
    function render{
    Obj = {
    id = Math.floor(Math.random() * 50) +1,
    name : input.value,
    last name : input2.value,
    email: input3.value,
    }
    arr.push(obj);
    }
    Эти все данные кидаются в таблицу...потом есть кнопка edit(которая кидает назад в inputы) и я например слегка изменяю данные имени там email ...и хочу их вернуть в изменённом виде назад..НО незнаю как это сделать
    Мне тут подсказывали что как-то по id объект...но я учусь и что-то запутался(((

    • @frontendscience
      @frontendscience  3 роки тому +1

      важный момент - Math.floor(Math.random() * 50) +1, вот этот код должен быть вне объекта. В объект должны записываться конечные данные - например id: 12345. Далее когда функция рендерит в таблице эти данные на кнопку edit надо повесить аттрибут data-id=12345. в обработчике edit тогда обращаться к obj['12345'].email и менять email к примеру

    • @ivanmikhailovich1963
      @ivanmikhailovich1963 3 роки тому

      @@frontendscience спасибо

  • @pavlokoval
    @pavlokoval 3 роки тому +2

    круто! дякую за відео. А як можна через push у тренарному виразі написати? мені чомусь undefined вертає(

    • @frontendscience
      @frontendscience  3 роки тому +2

      Тернарный оператор предназначен для присвоения значения. Можно вначале сделать значение котрое хотим запушить. let someVal = (codition)? 'var1' : 'var2'; arrat.push(someVal); Вот так можно использовать с push

    • @user-vy7yk9os7q
      @user-vy7yk9os7q 2 роки тому

      Через push, с использование тернарного оператора можно сделать следующим образом:
      arr.reduce((resArr, item) => resArr.includes(item) ? resArr : (resArr.push(item), resArr), [])
      1. resArr.includes(item) - проверяет есть ли элемент в результатирующем массиве resArr
      2. resArr - если есть, то возвращает (return) исходный массив
      3. (resArr.push(item), resArr) - если нет, то
      а. сначала мы push'им в результирующий массив элемент item
      b. затем возвращаем (return) его.
      Оператор "запятая" обрабатывает последовательно команды и возвращает только последнюю. Чтобы это было в одном выражении оборачиваем скобками.
      Если бы мы просто написали после двоеточия - resArr.push(item), то, согласно документации нам бы вернулось числовое значение равное длине новообразованного массива, а нам нужно возвращать массив, поэтому с push'ем именно таким образом сделано.

  • @user-cm1nh5ff5c
    @user-cm1nh5ff5c 5 років тому

    Почему-то первый способ не работает у меня, хотя вроде все также ввожу...

    • @smashno
      @smashno 5 років тому +1

      Никита, может быть несколько причин. 1) банальная опечатка. От этого может спасти эта ссылка: codepen.io/puzankov/pen/zeMrbN тут работающий код. 2) старый браузер, который не поддерживает ES6 arrow functions. в любом случае надо открывать консоль и смотреть что именно пошло не так.

  • @user-vk7jf4nj6d
    @user-vk7jf4nj6d 4 роки тому +2

    який метод працює швидше? Дякую

    • @smashno
      @smashno 4 роки тому +3

      тут многое зависит от данных и их размера. Но из современных вроде как Array.from(new Set()) показывает отличные результаты.

  • @alekssjeva951
    @alekssjeva951 3 роки тому

    7:44, Spread тут плохой вариант, так как работает намного медленнее push()

    • @frontendscience
      @frontendscience  3 роки тому

      Да как я и сказал - push тоже можно использовать. Просто с ним код вышел бы не таким лаконичным. В плане производительности этот вариант (последний) в принципе самый медленный - поэтому его можно использовать на маленьких массивах. А в этом случае разницы между push или spread не будет заметен.

    • @alekssjeva951
      @alekssjeva951 3 роки тому

      @@frontendscience Да, так-то spread выглядит красивее в коде, но если массив большой, то разница в скорости колоссальная.

    • @frontendscience
      @frontendscience  3 роки тому

      @@alekssjeva951 Да, это так. При использовании любого алгоритма надо понимать в каких условиях он будет использоваться. Какие входные данные и их объем.

    • @galievramil1169
      @galievramil1169 2 роки тому

      @@alekssjeva951 Привет, где можно почитать про скорости выполнения тех или иных операций!. Заранее спс

  • @user-nyxxx
    @user-nyxxx 2 роки тому +6

    Очень ждал, что в конце будет приведена сложность каждого из алгоритмов. Не дождался(((

    • @frontendscience
      @frontendscience  2 роки тому

      А должно было быть?

    • @user-nyxxx
      @user-nyxxx 2 роки тому

      @@frontendscience Ну мне кажется это логичным, что если приводится три алгоритма решения задачи, то в конце рассмотреть сложность каждого алгоритма и целесообразность его использования. Ради интереса замерил время выполнения для каждого варианта. Так, при использовании массива в 10 миллионов элементов время выполнения 1-го алгоритма в среднем 180мс, 2-го - 210мс и 3-го - 235мс. Т.е. разница небольшая и сложность каждого будет O(n*n). По сути можно спокойно пользоваться каждым из них, но 1-й лучше т.к. быстрее работает и быстрее пишется))) Но самым быстрым оказался вариант с использованием объекта - 145мс.

    • @frontendscience
      @frontendscience  2 роки тому

      Уважаемый Дмитрий, я рассказал ровно столько, сколько посчитал нужным в данном видео. И поделился рабочими крутыми вариантами. Если Вам нужно учитывать сложность каждого из этих вариантов в Вашем конкретном примере (потому что конкретно Ваш пример с большими объемами данных) - то Вы берете и замеряете эту сложность и выбираете какой из предложенных мной способов конкретно в Вашем случае Вам больше подходит. А не рассказываете мне, как Вы разочарованы, что я не указал сложность алгоритмов. Сложность алгоритмов не равно время отработки Вашего кода. Почитайте подробнее про это.

    • @user-nyxxx
      @user-nyxxx 2 роки тому

      @@frontendscience Жаль. Так хотелось Вам рассказать...

    • @frontendscience
      @frontendscience  2 роки тому

      @@user-nyxxx это на другие каналы.

  • @TheMuska006
    @TheMuska006 Рік тому

    Конвертировать массив в множество

  • @aleksd286
    @aleksd286 3 роки тому +1

    import { uniq } from 'lodash'
    uniq(someArray);

    • @TheJokerEXE
      @TheJokerEXE 2 роки тому

      ждал упоминание этого способа в видео