Задать вопрос
  • Как сделать сортировку дат в toLocaleString виде?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const sorted = (arr, key) => arr
      .map(n => [ key(n), n ])
      .sort(([a], [b]) => a < b ? -1 : +(a > b))
      .map(n => n[1]);
    
    
    const sortedArr = sorted(arr, n => new Date(n.replace(/(\d+)\.(\d+)\.(\d+),/, '$3-$2-$1')));
    // или
    const sortedArr = sorted(arr, n => n.replace(/.+(?=,)/, m => m.split('.').reverse().join('')));
    Ответ написан
    Комментировать
  • Как из массива строк получить те, у которых длина равна 5?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Дурацкому вопросу - дурацкий ответ:

    `${arr}`.match(/\b\w{5}\b/g) || []
    
    // или
    
    arr.reduce((acc, n) => (n.length ^ '0b101' || acc.push(n), acc), [])
    
    // или
    
    arr.filter(n => n[4] && !n[-~4])
    
    // или
    
    arr.filter(RegExp.prototype.test.bind(/^.....$/))
    
    // или
    
    arr.reduce((acc, n) => ((acc[n.search('$')] ??= []).push(n), acc), {})[5] ?? []
    
    // или
    
    (function xxx(arr, i = 0) {
      return arr.hasOwnProperty(i)
        ? [].concat(5 - [].push(...arr[i]) ? [] : arr[i], xxx(arr, i + 1))
        : [];
    })(arr)
    Ответ написан
    Комментировать
  • Как оптимизировать нерекурсивный обход дерева?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Что значит оптимизировать? Не хардкодить ключи? Уменьшить количество проверок? Всё просто: вложенные данные, а значит и необходимость что-то закинуть в стек, может случиться только при обработке объектов, так что вот это и надо проверять - что текущее значение, оно instanceof Object.

    Какие значения должны попадать в массив с результатами - этот вопрос тоже можно решить в более общем виде. Пусть это будет параметр - функция, принимающая значение и возвращающая true или false.

    Сортировку следует убрать. Если результаты нужны именно в отсортированном виде, то сортируйте их снаружи, нечего в одной функции решать несколько задач. Если же сортировка применяется для "исправления" результатов, то кривые они потому, что вы забыли, что данные из стека извлекаются в обратном порядке, т.е., надо изменить порядок добавления данных в стек.

    Короче вот, "оптимизировано":

    function getNestedData(data, test) {
      const result = [];
    
      for (const stack = [ data ]; stack.length;) {
        const n = stack.pop();
    
        if (n instanceof Object) {
          stack.push(...Object.values(n).reverse());
        }
    
        if (test(n)) {
          result.push(n);
        }
      }
    
      return result;
    }
    
    
    console.log(getNestedData(tree, Number.isFinite));
    Ответ написан
    Комментировать
  • Как вывести столько элементов, сколько всего в списке по шаблону?

    0xD34F
    @0xD34F
    print('\n'.join(f'{i}. {n}' for i, n in enumerate(clan_members, 1)))
    Ответ написан
    Комментировать
  • Как реализовать поиск по массиву с последующем добавлением класса соответствующим объектам?

    0xD34F
    @0xD34F Куратор тега Vue.js
    computed: {
      bullshitEmails() {
        const search = this.search.trim().toLowerCase();
        return this.emails.map(n => ({
          email: n,
          marked: !!search && n.toLowerCase().includes(search),
        }));
      },
    },

    <ul>
      <li
        v-for="{ email, marked } in bullshitEmails"
        v-text="email"
        :class="{ marked }"
      ></li>
    </ul>
    Ответ написан
    Комментировать
  • Как проверить есть ли число в списке зная только целую часть?

    0xD34F
    @0xD34F
    arr = [ '3.1', '5.1', '1.3', '2.2', '13.3' ]
    num = '5.666'
    
    print('OK' if any(n.split('.')[0] == num.split('.')[0] for n in arr) else 'FUCK OFF')
    Ответ написан
    2 комментария
  • Как найти в строке первый уникальный символ без учёта регистра?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Считаем повторения символов, приведённых к нижнему регистру, также, встречая символ впервые, запоминаем индекс и оригинальный вид символа (до приведения к нижнему регистру); ищем среди результатов подсчёта повторений такой, который равен единице, и при этом имеет минимально возможный индекс; достаём из найденного оригинальный символ:

    const firstNonRepeatingLetter = ([...str]) => Object
      .values(str.reduce((acc, n, i) => ((acc[n.toLowerCase()] ??= [ 0, i, n ])[0]++, acc), {}))
      .reduce((min, n) => (n[0] === 1 && n[1] < min[1] ? n : min), [ 0, Infinity, '' ])
      .pop();

    Или. Приводим строку к нижнему регистру; ищем индекс первого уникального символа, т.е. такого, у которого индекс первого вхождения в строку равен индексу последнего вхождения; по найденному индексу извлекаем из исходной строки символ:

    const firstNonRepeatingLetter = str =>
      str.charAt(Array
        .from(str.toLowerCase())
        .findIndex((n, i, a) => a.indexOf(n) === a.lastIndexOf(n))
      );
    Ответ написан
    Комментировать
  • Как отправлять запрос каждые N секунд, пока в ответ не получу нужный статус?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Асинхронная функция, внутри бесконечный цикл, в цикле запрос. Если результат запроса нас устраивает - выходим из цикла. Задержка между итерациями цикла реализуется с помощью промиса, который резолвится по таймауту.

    async function() {
      let result = null;
    
      while (1) {
        result = await fetch(...);
    
        if (result тот, который нужен) {
          break;
        }
    
        await new Promise(r => setTimeout(r, 5000));
      }
    
      return result;
    }
    Ответ написан
    6 комментариев
  • Как регуляркой взять символ процента?

    0xD34F
    @0xD34F Куратор тега Регулярные выражения
    (?<=\n)%(?=\n)
    Ответ написан
    Комментировать
  • Как сгруппировать данные списка?

    0xD34F
    @0xD34F
    grouped = {}
    
    for n in products:
      category = n['category']['name']
      group = grouped.setdefault(category, {})
      group[n['productId']] = { 'name': n['name'] }
    Ответ написан
    1 комментарий
  • Как получить самую давнюю дату, хранящуюся в массиве?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const [ date = null ] = arr.map(n => n.date).sort();

    или

    const date = arr.reduce((min, { date: n }) => min !== null && min < n ? min : n, null);

    или

    const date = arr.length
      ? new Date(Math.min(...arr.map(n => new Date(n.date)))).toISOString()
      : null;
    Ответ написан
    Комментировать
  • Как удалить из массива даты с определенным месяцем?

    0xD34F
    @0xD34F
    Собрать новый массив:

    $newArr = array_filter($arr, fn($n) => explode('.', $n)[1] !== '08');

    Изменить существующий:

    for ($i = 0, $j = 0; $i < count($arr); $i++) {
      if (explode('.', $arr[$i])[1] === '08') {
        $j++;
      } else if ($j) {
        $arr[$i - $j] = $arr[$i];
      }
    }
    
    array_splice($arr, -$j, $j);
    Ответ написан
    2 комментария
  • Как сделать кнопку больше-меньше на React чтобы скрыть или показать li?

    0xD34F
    @0xD34F Куратор тега React
    const [ showAll, setShowAll ] = useState(false);
    const defaultShow = 2;
    const showAllByDefault = ingredients.length <= defaultShow;
    const ingredientsToShow = (showAll || showAllByDefault)
      ? ingredients
      : ingredients.slice(0, defaultShow);

    {showAllByDefault
      ? null
      : <button onClick={() => setShowAll(val => !val)}>{showAll ? 'hide' : 'show'}</button>
    }
    <ul>
      {ingredientsToShow.map(n => <li>{n}</li>)}
    </ul>
    Ответ написан
    1 комментарий
  • Как запустить computed в VUE3?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Ключевое слово в качестве имени переменной - что за бред?
    Как достучаться до параметров из script setup - читаем документацию.
    У вычисляемого свойства нет сеттера - так пусть будет функцией, объект не нужен.

    Исправляем:

    const props = defineProps({
      showBgBlue: {
        type: Boolean,
        default: true,
      },
    });
    
    const mainClass = computed(() => props.showBgBlue ? 'bg-blueGray-50 py-12' : 'bg-white');
    Ответ написан
    5 комментариев
  • Как найти сумму элементов вложенных массивов?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Рекурсия есть:

    const sum = data =>
      Array.isArray(data)
        ? data.reduce((acc, n) => acc + sum(n), 0)
        : (+data || 0);

    Рекурсии нет:

    function sum(data) {
      let result = 0;
    
      for (const stack = [ data ]; stack.length;) {
        const n = stack.pop();
        if (n instanceof Array) {
          stack.push(...n);
        } else {
          result += +n || 0;
        }
      }
    
      return result;
    }

    Здесь, конечно, будет складываться всё, что можно сложить. Т.е., не только собственно числа, но и всё, что может быть сведено к числу, например true, '0xBB', { valueOf: () => 666 } и т.д.

    Если нужно складывать только числа - предлагаю подумать самостоятельно, как изменить представленный код.
    Ответ написан
    1 комментарий
  • Как вывести элементы массива в разные блоки по ID?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Странно, но все работает, несмотря на ошибку:

    TypeError: Cannot read properties of null (reading 'insertAdjacentHTML').

    Ничего странного, id существующих блоков совпадают с id первых объектов в массиве, т.е., сначала заполняются все существующие блоки, а уже потом случается ошибка, когда пытаетесь дёрнуть метод у отсутствующего блока.

    Какие есть способы победить ошибку:

    • Проверка наличия элемента перед тем как попытаться что-то в него добавить.

      Можно делать это явно:

      arr.forEach(n => {
        const el = document.getElementById(n.id);
        if (el) {
          el.innerHTML = `
            <h2>Id: ${n.id}</h2>
            <h3>${n.title}</h3>
            <p>${n.body}</p>
          `;
        }
      });

      Или не очень:

      for (const { id, title, body } of arr) {
        document.querySelector(`[id="${id}"]`)?.insertAdjacentHTML('beforeend', `
          <h2>Id: ${id}</h2>
          <h3>${title}</h3>
          <p>${body}</p>
        `);
      }

    • Создание элементов под все полученные объекты (в этом случае пусть section изначально будет пустым):

      document.querySelector('section').innerHTML = arr
        .map(n => `
          <div id="post-${n.id}">
            <h2>Id: ${n.id}</h2>
            <h3>${n.title}</h3>
            <p>${n.body}</p>
          </div>`)
        .join('');

    • Ограничение объёма получаемых данных.

      Если id элементов действительно имеют показанный вами вид (начинаются с 1 и идут по возрастанию), то просто запрашиваем столько объектов, сколько есть элементов:

      const limit = document.querySelector('section').children.length;
      const requestURL = `https://jsonplaceholder.typicode.com/posts?_limit=${limit}`;

      Или, можно запросить объекты с id как у элементов:

      const requestURL = 'https://jsonplaceholder.typicode.com/posts?' + Array
        .from(document.querySelector('section').children, n => `id=${n.id}`)
        .join('&');


    Какой из способов следует предпочесть? 2 + 3. Только, конечно, количество объектов или их id надо брать не из DOM.
    Ответ написан
  • Как можно улучшить модерирование?

    0xD34F
    @0xD34F
    Через форму обратной связи изложить администрации свои гениальные идеи (нет, это не насмешка, не сарказм - там такой пункт есть в выпадающем списке "тема"). Дальше надеяться, что администрация вас услышит, согласиться с услышанным и укажет модераторам на необходимость смены поведенческих паттернов.
    Ответ написан
    2 комментария
  • Почему при обновлении блока на нем перестает работать mouseover?

    0xD34F
    @0xD34F Куратор тега Vue.js
    new Vue({

    loaves: [

    this.loaves[idx] =

    Этих кусков кода достаточно, чтобы понять, какой именно раздел документации вы решили не читать.

    Перезапись элемента массива не отслежена => его свойства не стали реактивными => их изменения не приводят к обновлению DOM. Всё.
    Ответ написан
    Комментировать
  • Как сложить значения input'ов?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Кого складываем:

    const elements = document.querySelectorAll('[name^=AR_AMOUNT]');

    Нормальный способ - перебираем коллекцию элементов (цикл в явном виде или с помощью методов массива), достаём значения, складываем:

    const sum = Array.prototype.reduce.call(
      elements,
      (acc, n) => acc + +n.value,
      0
    );
    
    // или
    
    let sum = 0;
    for (const { value } of elements) {
      sum += Number(value);
    }

    Ненормальный способ - рекурсия. Функция получает коллекцию элементов и индекс, если элемент с указанным индексом существует, возвращаем его значение плюс результат рекурсивного вызова с индексом, увеличенным на единицу; если элемента нет - возвращаем 0:

    const sum = (function sum(arr, i) {
      return arr[i] ? parseFloat(arr[i].value) + sum(arr, i + 1) : 0;
    })(elements, 0);

    Дикий способ - сами ничего считать не будем. Выдёргиваем из коллекции элементов значения; склеиваем их, используя в качестве разделителя символ +, в строку; строку отдаём в eval; всё, сумма получена (ну, почти, если исходная коллекция элементов была пуста, то строка тоже будет пустой, так что надо не забыть подставить 0 вместо возможного undefined, который является результатом выполнения пустой строки):

    const sum = eval(Array.from(elements, n => n.value).join('+')) ?? 0;
    Ответ написан
    Комментировать
  • Как реализовать анимацию набора текста?

    0xD34F
    @0xD34F Куратор тега React
    function Typewriter({ text }) {
      const [ length, setLength ] = useState(0);
    
      useEffect(() => {
        setLength(0);
    
        const interval = setInterval(setLength, 100, length => {
          if (++length >= text.length) {
            clearInterval(interval);
          }
    
          return length;
        });
    
        return () => clearInterval(interval);
      }, [ text ]);
    
      return <div>{text.slice(0, length)}</div>;
    }
    Ответ написан
    Комментировать