Skip to content

Commit

Permalink
Правит булеву опечатку и унифицирует написание Lodash (#5568)
Browse files Browse the repository at this point in the history
* Правит булевую опечатку

* Единообразно пишет lodash

* Удаляет рекомендацию lodash

* Ещё больше унифицирует написание lodash

* Пишет везде Lodash с заглавной

* Удаляет рекомендацию lodash

* Меняет на более простые (для меня) формулировки

* Более лаконичный текст про `.cloneDeep()`

* Удаляет лишнюю строку

* Упрощает формулировку в сравнении объектов

* Удаляет лишнюю строку

* Частично восстанавливает оригинальную конструкцию

* Восстанавливает оригинальный текст

* Улучшает текст о копировании

Co-authored-by: Алексей Никитченко <[email protected]>

* Изменяет название ссылки

---------

Co-authored-by: Алексей Никитченко <[email protected]>
Co-authored-by: Tatiana Fokina <[email protected]>
  • Loading branch information
3 people authored Dec 10, 2024
1 parent f7c1cd0 commit 3c73ec8
Show file tree
Hide file tree
Showing 4 changed files with 8 additions and 14 deletions.
6 changes: 3 additions & 3 deletions interviews/filter-collection/answers/vitya-ne/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ console.log(new Set([{},{},{},{}]))
// Set(4) { {}, {}, {}, {} }
```

Если определяете «равенство» объектов, можно воспользоваться [библиотекой Lodash](https://lodash.com). В библиотеку входит метод `.isEqual()`, позволяющий сравнивать объекты:
Если определяете «равенство» объектов, можно воспользоваться [библиотекой _Lodash_](https://lodash.com). В библиотеку входит метод `.isEqual()`, позволяющий сравнивать объекты:

```js
function getUnique (array) {
Expand All @@ -79,11 +79,11 @@ function getUnique (array) {
}
```

Теперь перебираем элементы коллекции и накапливаем уникальные элементы в новом массиве `uniqueArray`, используя для поиска повторений метод массивов `.some()` и метод библиотеки Lodash `.isEqual()`. Сложность этого алгоритма равна O(n^2), так как требуется внутренний цикл для тестирования уникальности каждого элемента.
Теперь перебираем элементы коллекции и накапливаем уникальные элементы в новом массиве `uniqueArray`, используя для поиска повторений метод массивов `.some()` и метод библиотеки _Lodash_ `.isEqual()`. Сложность этого алгоритма равна O(n^2), так как требуется внутренний цикл для тестирования уникальности каждого элемента.

Можно улучшить гибкость нашего решения:
- адаптировать для использования не только массивов, но и других коллекций;
- устранить зависимость от библиотеки Lodash и дать возможность использовать собственную функцию для проверки уникальности элемента;
- устранить зависимость от библиотеки _Lodash_ и дать возможность использовать собственную функцию для проверки уникальности элемента;
- снизить сложность алгоритма до O(n).

Для этого проверим что аргументом функции является итерируемый объект, а обход будем осуществлять с использованием [for..of](/js/for-of/). Коллекцию уникальных элементов будем накапливать используя [Map](/js/map/). Это позволит сохранять ключи значений для ускорения определения уникальности значений. Кроме этого, добавим возможность передавать в качестве второго аргумента функцию-компаратор. Функция должна вернуть пару ключ/значение, которые будут добавлены в коллекцию уникальных элементов.
Expand Down
6 changes: 3 additions & 3 deletions js/group-by/practice/baileys-li.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
`Object.groupBy()` можно использовать как замену [аналогичному методу](https://lodash.com/docs/4.17.15#groupBy) из популярной, но уже устаревшей библиотеки Lodash.
`Object.groupBy()` можно использовать как замену [аналогичному методу](https://lodash.com/docs/4.17.15#groupBy) из популярной, но уже устаревшей библиотеки _Lodash_.


```diff
Expand All @@ -9,7 +9,7 @@
+ Object.groupBy(['one', 'two', 'three'], word => word.length)
```

Как видно, функции не полностью идентичны. Однако, если в вашей кодовой базе активно используется метод из lodash, стоит задуматься о замене. Особенно это важно для фронтенда, так как отказ от Lodash уменьшит размер бандла.
Как видно, функции не полностью идентичны. Однако, если в вашей кодовой базе активно используется метод из _Lodash_, стоит задуматься о замене. Особенно это важно для фронтенда, так как отказ от _Lodash_ уменьшит размер бандла.

Метод `groupBy()` поддерживается всеми основными браузерами, начиная с марта 2024 года. Если требуется поддержка более старых браузеров, это не проблема — написать полифил довольно легко:

Expand All @@ -30,7 +30,7 @@ if (!('groupBy' in Map)) {
Array.from(items).reduce((result, item, index) => {
const key = getKey(item, index)

if (result.has(key)) result.set(key, [])
if (!result.has(key)) result.set(key, [])

result.get(key).push(item)

Expand Down
2 changes: 1 addition & 1 deletion js/shallow-or-deep-clone/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ console.log(itemsInCart[1] === deep[1])

Существуют и другие способы сделать глубокое копирование. Можно написать функцию глубокого копирования вручную. Скорее всего ваша функция будет [рекурсивной](/js/recursion/), и она будет работать только для конкретных данных — написать универсальную функцию не так-то просто.

Можно воспользоваться готовой библиотекой. Например, функцию глубокого копирования содержит популярная библиотека утилит [_lodash_](https://lodash.com/docs/4.17.15#cloneDeep). Функция гарантировано работает в подавляющем большинстве случаев, потому что используется в десятках тысяч проектов каждый день. Исходный код библиотеки открыт, можно изучить [исходный код функции глубокого копирования](https://github.com/lodash/lodash/blob/4.17.15/lodash.js#L2620).
Проще воспользоваться готовыми решениями, например, методом [`.cloneDeep()`](https://lodash.com/docs/4.17.15#cloneDeep) из библиотеки _Lodash_. Он надёжен и используется в десятках тысяч проектов каждый день. Кстати, изучить его реализацию можно на [GitHub](https://github.com/lodash/lodash/blob/4.17.15/lodash.js#L2620).

```js
import cloneDeep from 'lodash.clonedeep'
Expand Down
8 changes: 1 addition & 7 deletions js/spread/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -163,12 +163,6 @@ const watched = [...movies, ...series]
// ]
```

<aside>

☝️ При использовании спред-синтаксиса элементы массива копируются только на один уровень вложенности. Если массив содержит объекты, то это будут те же самые объекты, что и в исходном массиве. Для глубокого копирования пользуйтесь библиотеками, например, [_lodash_](https://lodash.com/docs/4.17.15#cloneDeep)

</aside>

Пример поведения с уровнем вложенности больше одного:

```js
Expand Down Expand Up @@ -232,6 +226,6 @@ console.log(userData)

<aside>

☝️ При использовании спред-синтаксиса свойства объекта копируются только на один уровень вложенности. Это называется [поверхностным копированием](/js/shallow-or-deep-clone/). Для глубокого копирования пользуйтесь библиотеками, например, [lodash](https://lodash.com/docs/4.17.15#cloneDeep)
☝️ При использовании спред-синтаксиса свойства объекта копируются только на один уровень вложенности. Это называется [поверхностным копированием](/js/shallow-or-deep-clone/). Как получить глубокую копию читайте в статье «[Поверхностное и глубокое копирование](https://doka.guide/js/shallow-or-deep-clone/#kak-poluchit-glubokuyu-kopiyu)».

</aside>

0 comments on commit 3c73ec8

Please sign in to comment.