Заковырка какая то примерчик с редьюсами с метаданными .. сложная абстракция... Это в вызове первый аргумент - методанные из партиал с , а второй аргумент (obj) откудова из мэпа получается приходит ? и этот obj приходит через рест параметры . так что ли ?
Не проще, с классом в каждом случае нужно писать императивный код, а с проекцией просто декларативную структуру, она и нагляднее и пишется проще и тестировать ее не нужно, по сути это схема, а не код
@@TimurShemsedinov поверю Вам на слово, т.к. ещё, видимо, не дорос до такого... Я DTO через класс организовываю... Попробую осмыслить это видео. Спасибо!
Спасибо еще раз (случайно удалил предидущий коментарий) . Вот код разширеный projection для работы с вложеными дикшинари, без оборачивания в класс. Вы совершенно верно заметили, что просто так этого делать не нужно. const projection = (meta) => { const keys = Object.keys(meta); // debugger; const mapper = obj => { const hash = {}; for (const key of keys) { const def = meta[key]; const [name, transform] = def; let val = obj[name]; if (val !== void 0) { if (transform) { const cls = Object.prototype.toString().call(transform).slice(8,-1); switch(cls){ case 'Function': val = transform(val);break; case 'Object': val = projection(transform)(val);break; case 'Array': val = val.map(projection(transform));break; } } hash[key] = val; } } return hash; }; return mapper; }
@@vsuschenko а, ну конечно, reduce приводит к косвенной рекурсии или непрямой рекурсии. В reduce передается колбэк, и по завершению этого колбэка reduce его повторно вызывает. Это все равно, что рекурсия.
@@TimurShemsedinov там то же самое, что и в методе map. или forEach. просто передается результат который колбек вернул на предыдущей итерации. причем тут рекурсия? developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce почитайте описание. там внизу и полифил есть для старых браузеров. как видно - никакой рекурсии. обычный цикл.
@@vsuschenko сори, это я функциональным программированием перезанимался, классический функциональный reduce он рекурсивный, потому, что нельзя циклы писать, вот он: const reduce = (fn, acc, [cur, ...rest]) => cur === undefined ? acc : reduce(fn, fn(acc, cur), rest); Я согласен, что у Array.prototype.reduce действительно сделан на циклах, но это видно не из-за полифила, он все же написан на C++ внутри V8, а понятно это из-за того, что не случается переполнения стека на reduce огромных массивов.
Спасибо большое! давно для себя заметил, что примеры с reduce как то легче читаются, код компактнее и лаконичнее выглядит, все рядом
Тимур спасибо Вам огромное, отличные примеры, работа с данными одна из самых интересных тем для меня лично ))
00:00:00 Введение
00:01:50 Простая проекция набора данных
00:09:23 Расширенная проекция набора данных
00:19:00 Расширенная проекция набора данных с кэшированием списка ключей
00:20:27 Оптимизация проекции набора данных с помощью императивного программирования
00:23:11 Линзы из функционального программирования
00:32:29 Сложная проекция набора данных ( проекция изнутри и снаружи )
00:39:08 Сложная проекция набора данных с помощью декларативного программирования
00:41:57 Оптимизация сложной проекции
00:51:36 Синтаксис фильтрации
00:53:25 Вывод
00:58:08 Оптимизация
01:00:00 Обобщение
Мне очень нравятся такие абстракции, аж мурашки по коже!!!)
Круто як завжди!
Топ контент, спасибо!
Тимуре, який ти класний препод 👍
Дякую, все для вас)
Спасибо большое!
medium.com/javascript-scene/lenses-b85976cb0534
Мне помогло допонять линзы :)
Ни@я не понял , но оочень интересно ! ))
Спасибо
Заковырка какая то примерчик с редьюсами с метаданными .. сложная абстракция... Это в вызове первый аргумент - методанные из партиал с , а второй аргумент (obj) откудова из мэпа получается приходит ? и этот obj приходит через рест параметры . так что ли ?
Спасибо )
Что-то я не понял, а не проще сделать класс, в который передавать объект, а его конструктор отберёт и преобразует, если нужно, любые нужные поля.
Не проще, с классом в каждом случае нужно писать императивный код, а с проекцией просто декларативную структуру, она и нагляднее и пишется проще и тестировать ее не нужно, по сути это схема, а не код
@@TimurShemsedinov поверю Вам на слово, т.к. ещё, видимо, не дорос до такого... Я DTO через класс организовываю...
Попробую осмыслить это видео. Спасибо!
Спасибо еще раз (случайно удалил предидущий коментарий) . Вот код разширеный projection для работы с вложеными дикшинари, без оборачивания в класс. Вы совершенно верно заметили, что просто так этого делать не нужно.
const projection = (meta) => {
const keys = Object.keys(meta);
// debugger;
const mapper = obj => {
const hash = {};
for (const key of keys) {
const def = meta[key];
const [name, transform] = def;
let val = obj[name];
if (val !== void 0) {
if (transform) {
const cls = Object.prototype.toString().call(transform).slice(8,-1);
switch(cls){
case 'Function': val = transform(val);break;
case 'Object': val = projection(transform)(val);break;
case 'Array': val = val.map(projection(transform));break;
}
}
hash[key] = val;
}
}
return hash;
};
return mapper;
}
тяажкувато сприймається... доки в консоль не виведеш проміжні результати, важко слідкувати. і консолів треба не мало
какая рекурсия в projection? где вы ее увидели?
на какой минуте?
@@TimurShemsedinov 7:25
@@vsuschenko а, ну конечно, reduce приводит к косвенной рекурсии или непрямой рекурсии. В reduce передается колбэк, и по завершению этого колбэка reduce его повторно вызывает. Это все равно, что рекурсия.
@@TimurShemsedinov там то же самое, что и в методе map. или forEach. просто передается результат который колбек вернул на предыдущей итерации. причем тут рекурсия? developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce почитайте описание. там внизу и полифил есть для старых браузеров. как видно - никакой рекурсии. обычный цикл.
@@vsuschenko сори, это я функциональным программированием перезанимался, классический функциональный reduce он рекурсивный, потому, что нельзя циклы писать, вот он: const reduce = (fn, acc, [cur, ...rest]) => cur === undefined ? acc : reduce(fn, fn(acc, cur), rest); Я согласен, что у Array.prototype.reduce действительно сделан на циклах, но это видно не из-за полифила, он все же написан на C++ внутри V8, а понятно это из-за того, что не случается переполнения стека на reduce огромных массивов.
Не спорю все круто но чисто для мене важко навчатись в такому режимі перегляду слайдів дуже багато чого не зрозуміло((
> JavaScript выработает скрытый класс.
Вообще-то движок, в нашем случае V8, выработает скрытый класс.
как же ты хорош, указал автору на его ошибку
Сложно написанный код. Несколько заходов, всё ещё не досмотрел.
Ну это же не первая лекция, нужно начинать с простого