• Как просуммировать элементы массива, расположенные до нуля?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const sum = arr.reduceRight((acc, n) => n && acc + n, 0);

    или

    let sum = 0;
    for (let i = 0; arr[i]; sum += arr[i++]) ;

    или

    let sum = 0;
    for (const n of arr) {
      if (!n) {
        break;
      }
      sum += n;
    }

    или

    const sum = (function sum(arr, i = 0) {
      return arr[i] ? arr[i] + sum(arr, i + 1) : 0;
    })(arr);
    Ответ написан
    1 комментарий
  • Как преобразовать имена свойств объекта из kebab-case в camelCase?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    В дополнение к ответу 0xD34F нормальная типизация такой функции (нужен typescript 4.1 или выше):
    type AsCamelCase<S extends string> = S extends `${infer A}_${infer B}` ? `${A}${Capitalize<AsCamelCase<B>>}` : S;
    type CamelCaseKeysRecord<T> = T extends Record<PropertyKey, unknown> ? {
        [K in string & keyof T as AsCamelCase<K>]: CamelCaseKeysRecord<T[K]>;
    } & {
        [K in Exclude<keyof T, string>]: CamelCaseKeysRecord<T[K]>;
    } : T;
    
    function toCamelCaseKeys<T>(val: T): CamelCaseKeysRecord<T> {
        if (Array.isArray(val)) {
            return val.map(toCamelCaseKeys) as unknown as CamelCaseKeysRecord<T>;
        }
        if (typeof val === 'object') {
            return Object.fromEntries(Object
                .entries(val)
                .map(([k, v]) => [
                    k.replace(/_+(.)/g, (_, g) => g.toUpperCase()),
                    toCamelCaseKeys(v as Record<string, unknown>),
                ])) as CamelCaseKeysRecord<T>;
        }
        return val as unknown as CamelCaseKeysRecord<T>;
    }

    https://www.typescriptlang.org/play?target=7&ts=4....
    Ответ написан
    6 комментариев
  • JavaScript - как проверить, есть ли в объекте циклические ссылки?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Поиск в глубину.

    Надо поддерживать список/множество уже посещенных вершин и пока посещаемых (те, что в стеке). При заходе в вершину в рекурсивной функции помещайте ее в множество пока посещаемых. При возвращении из функции перемещайте вершину в множество уже посещенных. В функции пройдитесь по всем ребрам, если они ведут в пока посещаемую вершину - вы нашли цикл. Если ребро ведет в уже посещенную - игнорируйте его. Если ребро ведет в не посещенную вершину - рекурсивно запускайтесь от нее.
    Ответ написан
    Комментировать
  • Как такое сверстать?

    SeaInside
    @SeaInside
    15 лет пилю все эти штуки
    Вот здесь, например, делал когда-то такую вещь (блок "Этапы создания корпоративного сайта").

    605df09f637c9864487824.jpeg

    Идея, вкратце:
    1. Элементы размещаете просто в сетку с помощью inline-block/float/flex/grid - как привычнее.
    2. Родителю задаёте относительное позиционирование, в него помещаете абсолютный элемент на всю ширину/высоту с небольшим запасом, на котором будете рисовать SVG.
    3. Как нарисуется - на js считаете ключевые точки (координаты), через которые нужно провести линии.
    4. Динамически рисуете SVG по вашим ключевым точкам.
      О том, какие варианты вообще есть, можно почитать на MDN, например.
      Выглядеть это будет примерно так:

      605df0b0256ca826129561.jpeg

      В вашем случае рекомендую использовать кривые Безье. Здесь мне нужно было сделать полукруг, поэтому я использовал дуги, у вас же просто статичная величина закругления.
    5. На ресайз окна считаете ключевые точки заново и перерисовываете SVG.
    6. Опционально заморачиваетесь и добавляете сверху ещё один путь, который по скроллу будет "заполняться"


    Это в целом чёрная магия, можно полдня убить, но красиво :)
    Если это всё очень сложно, то просто картинкой вставьте, высоту элементов фиксируйте, и меняйте картинку для адаптивных вариантов.

    Готовых вариантов тут в общем-то вы вряд ли найдёте, нужно взять и разработать.
    У меня была идея оформить это в какую-то библиотеку, но как и все остальные идеи - и ныне лежит в туду-листе на 60+ пунктов. :)
    Ответ написан
    12 комментариев
  • Знак _ в стрелочных функциях. Можно ли использовать?

    Stalker_RED
    @Stalker_RED
    Вместо _ можно использовать о_0

    const arrowInHead =o_0=> Marth.random;

    ...и код становится веселее!
    Ответ написан
    Комментировать
  • Что за потеря контекста webgl и с чем её едят?

    sfi0zy
    @sfi0zy Куратор тега JavaScript
    Creative frontend developer
    Пытаюсь создать рисовалку на webgl2

    Стоит посмотреть на поддержку WebGL2 в Safari, осознать, что экспериментальная фича даже при "зеленой" поддержке не отличается стабильностью, и подумать еще раз пока не поздно. Но это так, к слову. Раз уж говорим про качество и надежность.

    Что произойдёт с данными при потере контекста? ...потом восстанавливать его? ...старый контекст автоматически удалится или так и будет висеть в небытии?

    По теме есть хорошая заметка из первых рук. Там есть ответы на ваши вопросы с подробностями и примерами кода.

    Может вообще забить на эту потерю контекста? Как часто она происходит? Раз на миллион?

    Происходит действительно редко. Я за все время экспериментов с WebGL не столкнулся ни разу. То есть такое впечатление, что скорее браузер намертво повесится, чем сбросит контекст. Нужна ли супер-надежность с обработкой этого редкого сценария в вашем конкретном случае - решать вам. Но в целом мало кто об этом заботится.
    Ответ написан
    Комментировать
  • Как реализовать подобную анимацию?

    sfi0zy
    @sfi0zy Куратор тега JavaScript
    Creative frontend developer
    В соседнем ответе все верно написали. CSS-трансформации - это именно то, что нужно в такой ситуации. Технически вся красота возникает из-за параллакса - там несколько слоев движутся с разной скоростью. Так что здесь не обязательно именно слайдер использовать - это может быть любой инструмент для построения кастомного скролла (с инерцией). При желании можно свой написать, это не так сложно, нужен лишь школьный справочник по физике, но можно и готовый инструмент взять. Тот же Locomotive Scroll вполне сгодится.

    В этом примере как раз что-то похожее (только нужно открыть на CodePen - горизонтальный скролл не очень дружит с iframe-вставками):
    Ответ написан
    1 комментарий
  • Как сделать проверку на отсутствие тэга внутри родителя?

    Seasle
    @Seasle Куратор тега JavaScript
    const checkTag = (parent, tag, isImmediate = false) => {
    	const selector = isImmediate ? `:scope > ${tag}` : tag;
    	const element = parent.querySelector(selector);
    	
    	return element !== null;
    };

    Ответ написан
    Комментировать
  • Не пойму по какой формуле расчитывать X и Y матрицы для ее заполнения?

    Lynn
    @Lynn
    nginx, js, css
    Вот функция для вычисления строки в треугольнике до диагонали 5fddae5049bb2124714331.jpeg

    ceil((sqrt(8*n + 1) - 1)/2)
    Для вычисления столбца надо учесть чётность строки (для направления).
    Ответ написан
    4 комментария
  • Маленькая js библиотека для реактивности?

    Kozack
    @Kozack Куратор тега JavaScript
    Thinking about a11y
    Vue 3. Именно 3.
    Можно использовать без сборщика. Но с ним, всё таки получше.
    Ну, и можно вытащить только несколько функций, из фреймворка для реактивности а всё остальное не использовать. (Пример)
    Ответ написан
    1 комментарий
  • Как вычислить коэффициент уменьшения вписанного в квадрат квадрата под углом n градусов?

    Lynn
    @Lynn
    nginx, js, css
    α — угол DOH (насколько повернули квадрат)
    β — угол DHO, γ — HDO (45°), DO — половина диагонали исходного квадрата (константа)
    β = 180° - α - γ = 135° - α
    По теореме синусов при 0° <= α <= 90°
    DO / sin(β) = HO / sin(γ) =>
    HO = DO * sin(γ) / sin(β) =>
    HO = DO / (sqrt(2) * sin(135° - α))
    5fc6ba3849446844557055.jpeg

    Но как вы хотите запихать эту формулу в CSS это сложный вопрос
    Ответ написан
    4 комментария
  • Как вычислить коэффициент уменьшения вписанного в квадрат квадрата под углом n градусов?

    ProgrammerForever
    @ProgrammerForever
    Учитель, автоэлектрик, программист, музыкант
    Внутренняя сторона x
    Внешняя kx
    В то же время, внешняя это сумма катетов, т.е. xcos(a)+xsin(a).

    Тогда k=cos(a)+sin(a)
    Ответ написан
    Комментировать
  • Как понять входит ли точка в квадрат?

    Seasle
    @Seasle Куратор тега JavaScript
    const point = (x, y) => ({ x, y });
    
    const A = point(-1, 1);
    const B = point(1, 1);
    const C = point(1, -1);
    const D = point(-1, -1);
    const E = point(0, 0);
    
    const side = (a, b, p) =>  Math.sign((b.x - a.x) * (p.y - a.y) - (b.y - a.y) * (p.x - a.x));
    
    const inArea = side(A, B, E) === -1 &&
                   side(B, C, E) === -1 &&
                   side(C, D, E) === -1 &&
                   side(D, A, E) === -1;
    
    console.log(inArea); // true


    На Lua

    function point(x, y)
        return { ["x"] = x, ["y"] = y }
    end
    
    function sign(number)
        if (number < 0) then
            return -1
        elseif (number > 0) then
            return 1
        else 
            return number
        end
    end
    
    function side(a, b, p)
        return sign((b.x - a.x) * (p.y - a.y) - (b.y - a.y) * (p.x - a.x))
    end
    
    A = point(-1, 1)
    B = point(1, 1)
    C = point(1, -1)
    D = point(-1, -1)
    E = point(0, 0)
    
    inArea = side(A, B, E) == -1 and
             side(B, C, E) == -1 and
             side(C, D, E) == -1 and
             side(D, A, E) == -1;
    
    print(inArea) -- true

    Ответ написан
    4 комментария
  • Как постоянно генерировать массив с рандомными но близкими друг другу числами в Javascript?

    Seasle
    @Seasle Куратор тега JavaScript
    Существует шум Перлина (Perlin Noise, Simplex Noise 2D), возвращающий числа в интервале [0; 1], либо в интервале [-1; 1], в зависимости от реализации. Если найдете ту, которая возвращает числа в интервале [-1; 1], тогда превращаете в интервал [0; 1] (полученное число делите на 2 и прибавляете 0.5) и умножаете на некий коэффициент.
    Ответ написан
    Комментировать
  • Как правильно сверстать такой блок?

    ArsenyMatytsyn
    @ArsenyMatytsyn Куратор тега HTML
    Руководитель frontend направления, предприниматель
    Используй гриды в логике
    grid-template-columns: calc((100% - 1200px)/2)) 3fr 7fr calc((100% - 1200px)/2))
    . Тогда пикче можно задать позицию grid-column: 1 / span 2, а тексту grid-column-end: span 1.

    Шаманские танцы с позиционированием это атавизм прошлого.
    Ответ написан
    1 комментарий
  • Почему в браузере google chrome добавленные элементы в блок уезжают наверх, когда в mozilla firefox уходят вниз?

    @cheeroque
    Это чудесное изобретение гугла называется Scroll anchoring. Чтобы отключить, добавьте в CSS:

    body {
      overflow-anchor: none;
    }
    Ответ написан
    2 комментария
  • Как сделать сдвиг элемента списка относительно предыдущего?

    Ankhena
    @Ankhena Куратор тега CSS
    Нежно люблю верстку
    Не без проблем, но без явного указания номера элемента
    https://jsfiddle.net/9d2mzLyn/

    Но нужен overflow для родителя, высота для псевдо больше максимальной высоты пункта списка и чтобы вся конструкция помещалась по горизонтали.
    У вас, кстати, псевдо и по макету подходит.

    Я сомневаюсь, что такая лестница нужна больше, чем для 10-ка пунктов (да и в 10 не верю). Так что проще напрямую через nth-child.
    Ответ написан
    Комментировать
  • На каких технологиях создан сайт сериала тьма?

    sfi0zy
    @sfi0zy Куратор тега JavaScript
    Creative frontend developer
    Крайне любопытен с точки зрения визуальной составляющей.
    Мне бы хотелось понимать, посредством каких технологий он был сделан.


    Не глядя в код, можно предположить использование следующих технологий:
    1. Волны абстрактные и на фотографиях, шум на фоне - WebGL, шейдеры. Вода на первом экране - скорее всего моделируется как идеальная жидкость, волны на фотографиях - чисто геометрические.
    2. Обведение текста в овал, трилистник с пунктиром, стрелки на карте - SVG, рисование линии по такому принципу.
    3. Плавные переходы между экранами можно делать по-разному, даже забытый модными фронтендерами pjax будет к месту. Можно познакомиться с barba.js - это если не самый популярный, то один из популярных инструментов для работы с плавными переходами. Можно использовать роутеры из SPA-фреймворков, не принципиально. Самое сложное здесь - все синхронизировать.
    4. Карта с персонажами - это может быть обычная верстка, подложенная под канвас с шумом. Самый простой вариант.
    5. Есть небольшое покачивание элементов вслед за мышкой, логично предположить, что это банальная CSS-трансформация на mousemove.
    6. Рисование дуг из точек - это может быть либо SVG, как в п.2, только эта линия будет маской, либо можно это строить как графики.
    7. Ну и немного стандартных CSS-анимаций там тоже есть.


    Дополнительные библиотеки здесь - дело вкуса, можно и на ванильном JS все сделать, разве что роутер я бы взял готовый. Вся соль в визуальных эффектах, а для них готовых решений не будет, если работа будет строиться по принципу "сначала придумать, потом сделать".
    Ответ написан
    Комментировать
  • Как решить задачу?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Это известная задача иосифа. По ссылке есть всякие решения. Вам подойдет самое тупое и медленное. У вас в задаче k прибито гвоздями к 2.

    Понять те формулы можно примерно так. Съели мы первый куст, перешли ко второму. Теперь перенумеруем их, что останется? Та же самая задача, только с n-1 кустом. Только все кусты сдвинуты на k позиций и один номера у них на один уменьшены. Т.е. можно взять тот самый куст который при n-1 останется и найти, какой у него был номер до сдвига.
    Ответ написан
    Комментировать
  • Как заставить MutationObserver адекватно срабатывать?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Именно из-за таких как ты отказались от удобного слушателя событий изменения элементов, и придумали наблюдатель.
    Разница? Наблюдатель наблюдает и изредка, когда это не повлияет на скорость работы страницы, сбрасывает весь список изменений. В отличии от слушателя, который слушает каждое событие изменения.

    Так делать нельзя, категорически. Это бессмысленная тяжёлая нагрузка. Ты вызываешь изменения стиля своей функцией, вот из этой функции и производи иные изменения. Тебе не нужны наблюдатели и события для этого.
    Ответ написан
    2 комментария