Задать вопрос
  • Как исправить ошибку при запуске GULP-a Error in plugin “gulp-sass”?

    @nik_devil_jr
    Попробуй вот так объявить переменную, у меня сработало
    let sass = require('gulp-sass')(require('sass'));
    Ответ написан
    Комментировать
  • Как отрисовать компонент CircleTopik только в среднем компоненте Card?

    0xD34F
    @0xD34F Куратор тега React
    function Card(props) {
      return (
        <div>
          {props.children}
        </div>
      );
    }
    
    function App() {
      return (
        <div>
          <Card />
          <Card>
            <CircleTopik />
          </Card>
          <Card />
        </div>
      );
    }

    или

    function Card({ showCircle }) {
      return (
        <div>
          {showCircle ? <CircleTopik /> : null}
        </div>
      );
    }
    
    function App() {
      return (
        <div>
          <Card />
          <Card showCircle />
          <Card />
        </div>
      );
    }
    Ответ написан
    Комментировать
  • Как извлечь случайный элемент из вложенных массивов?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Извлечение случайного элемента массива выносим в отдельную функцию:

    const random = arr => arr[Math.random() * arr.length | 0];

    Дальше можно получить случайный элемент случайного элемента:

    const item = random(random(Object.values(state.themes)));

    Или вложенный массив превратить в плоский и получить случайный элемент один раз:

    const item = random(Object.values(state.themes).flat());

    Какой из вариантов предпочесть? Зависит от того, как должны распределяться вероятности выпадения элементов - в случае, если выбирать элемент в два приёма, и размеры вложенных массивов различны, вероятности будут разными для разных массивов. Предположим, есть два вложенных массива, в одном два элемента, во втором сто. Получается, у элементов первого массива шанс быть выбранными один к четырём (один из двух массивов, один из двух элементов - 0.5 умножается на 0.5), а у элементов второго - один к двумстам (0.5 * 0.01).

    То есть, если должны быть равны вероятности выпадения элементов - объединяем вложенные массивы в один. Если равными должны быть вероятности принадлежности выбранного элемента к вложенным массивам, то выбираем сначала массив, а потом элемент внутри него.

    Но что если вероятности выпадения элементов должны быть равны, а размеры вложенных массивов велики, и не хотелось бы тратить на их объединение ни время, ни память? Возвращаемся к двум выборам, но выбирать вложенные массивы надо не с равными вероятностями, а учитывая их размеры:

    function weightedRandom(arr, key = () => 1) {
      const val = key instanceof Function ? key : n => n[key];
      const max = arr.reduce((acc, n) => acc + val(n), 0);
    
      return () => {
        let rand = Math.random() * max;
        return arr.find(n => (rand -= val(n)) < 0);
      };
    }

    const randomArr = weightedRandom(Object.values(state.themes), 'length');
    
    // ...
    
    const item = random(randomArr());
    Ответ написан
    Комментировать