Задать вопрос
  • Как изменить вложенное свойство через сцепление во vue?

    0xD34F
    @0xD34F Куратор тега Vue.js
    computed: {
      model() {
        return new Proxy(Object.fromEntries(this.obj2.map(n => [ n.model, null ])), {
          get: (target, prop) => typeof prop === 'string'
            ? prop.split('.').reduce((p, c) => p?.[c], this.obj)
            : target[prop],
          set: (target, prop, value) => {
            const keys = prop.split('.');
            const key = keys.pop();
            const obj = keys.reduce((p, c) => (!p.hasOwnProperty(c) && this.$set(p, c, {}), p[c]), this.obj);
            this.$set(obj, key, value);
            return true;
          },
        });
      },
    },

    <div v-for="(v, k) in model">
      <input v-model="model[k]">
    </div>

    https://jsfiddle.net/34brtvok/

    Или, если несуществующие пути не должны обрабатываться, можно сделать попроще:

    computed: {
      model() {
        return this.obj2.map(n => {
          const keys = n.model.split('.');
          const key = keys.pop();
          const obj = keys.reduce((p, c) => p?.[c], this.obj);
    
          return obj && { obj, key };
        }).filter(Boolean);
      },
    },

    <div v-for="n in model">
      <input v-model="n.obj[n.key]">
    </div>

    https://jsfiddle.net/34brtvok/1/
    Ответ написан
    Комментировать
  • Как выбрать все элементы, кроме первого и последнего?

    0xD34F
    @0xD34F Куратор тега CSS
    li:not(:first-child, :last-child)

    или

    li:not(:first-child):not(:last-child)

    или

    li {
      /* тут стили для всех элементов */
    }
    li:first-child,
    li:last-child {
      /* здесь сбрасываете стили, установленные выше */
    }

    https://jsfiddle.net/6zxdwear/
    Ответ написан
    Комментировать
  • Почему компонент не перерисовывается?

    0xD34F
    @0xD34F Куратор тега React
    Вызов switchPatternTable внутри обработчика клика - зачем он там? Да ещё и результат улетает в никуда.

    Вызов switchPatternTable в "нужном участке страницы" - во-первых, параметр не передаётся, т.е., результат всегда будет один и тот же; во-вторых, из показанного огрызка неясно, что с этим результатом происходит дальше.

    Как бы мог выглядеть рабочий код (вам на подумать - как добавить сюда дефолтный вариант).
    Ответ написан
    Комментировать
  • Как переписать значения во вложенных объектах?

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

    const replaceValues = (val, test, replacer, key) =>
      test(key, val)
        ? replacer(val)
        : val instanceof Object
          ? Object.entries(val).reduce((acc, [ k, v ]) => (
              acc[k] = replaceValues(v, test, replacer, k),
              acc
            ), val.constructor())
          : val;

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

    function replaceValues(val, test, replacer) {
      const stack = [];
      const clones = new Map;
      const getClone = (v, k) =>
        test(k, v)
          ? replacer(v)
          : v instanceof Object
            ? (clones.has(v) || stack.push([ v, clones.set(v, v.constructor()).get(v) ]),
               clones.get(v))
            : v;
    
      if (val instanceof Object) {
        for (getClone(val); stack.length;) {
          const [ source, target ] = stack.pop();
          for (const k in source) if (Object.hasOwn(source, k)) {
            target[k] = getClone(source[k], k);
          }
        }
      }
    
      return getClone(val);
    }

    Как применять в вашем случае:

    const newData = replaceValues(
      data,
      k => k?.endsWith('Date'),
      v => v.replace(/(\d+)-(\d+)-/, '$2.$1.')
    );
    Ответ написан
    6 комментариев
  • Как достать из текста данные в таком виде с помощью PHP?

    0xD34F
    @0xD34F Куратор тега Регулярные выражения
    preg_match_all('~\[(.+?)\|(.+?)\]~', $str, $matches);
    Ответ написан
  • Как из объекта Proxy извлечь данные?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Точно так же, как если бы вместо Proxy у вас был оригинальный объект (кстати, а почему вы этого не попробовали сделать - что, увидели этот непонятный Proxy и испугались?).

    Vue заворачивает данные в Proxy для отслеживания изменений. Если вдруг очень надо, можно получить оригинальные данные с помощью toRaw.

    получить массив

    А где у вас там массив? Никакого массива нет. Или исправляйте код на сервере, чтобы присылались верные данные, или используйте Object.values.
    Ответ написан
    Комментировать
  • Как удалить элемент массива и сменить оставшиеся ключи на 1 меньше?

    0xD34F
    @0xD34F
    Получить массив с правильными индексами можно с помощью array_values.

    Правда, с учётом решаемой вами задачи...

    присвоить первому массиву значения второго только без первого элемента

    ...вам это не потребуется - используйте array_slice вместо той ерунды с unset.
    Ответ написан
  • Как в jQuery улучшить функцию для работы с отдельными блоками?

    0xD34F
    @0xD34F Куратор тега JavaScript
    $('.content_toggle').click(function() {
      const $button = $(this);
    
      $(`#box-${this.id.split('-').pop()}`).slideToggle(300, function() {
        const isHidden = $(this).is(':hidden');
        $button
          .text(isHidden ? 'Показать текст' : 'Скрыть текст')
          .toggleClass('open', !isHidden);
      });
    
      return false;
    });

    Если вдруг каждая пара кнопка-блок помещена в отдельный элемент, то можно обойтись без этой ерунды с id, получение блока будет выглядеть так:

    $(this).closest('здесь селектор общего предка').find('.content_block')

    Или, если все элементы расположены последовательно, кнопка-блок-кнопка-блок-..., то тогда блок можно будет получить следующим образом:

    $(this).next()

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

    $('.content_block').eq($('.content_toggle').index(this))
    Ответ написан
    Комментировать
  • Как сделать замену токенов в строке по ключам из массива?

    0xD34F
    @0xD34F
    echo preg_replace_callback('~\[(.+?)\]~', fn($m) => $array[$m[1]] ?? $m[0], $message);
    Ответ написан
    4 комментария
  • Как убрать реактивность?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Вам это не нужно.

    Компонент, который занимается редактированием - пусть он создаёт внутри себя копию редактируемых данных, и работает с копией. А по нажатию кнопки сохранения эта копия передаётся в мутацию, где значения её свойств будут записаны в оригинальный объект. Как-то так.
    Ответ написан
    Комментировать
  • Почему пропадает реактивность при слиянии объектов?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Потому что вы заменяете реактивный объект обычным.

    Вместо присваивания нового объекта добавляйте свойства одного другому:

    Object.assign(object1, object2);

    Ну или оборачивайте новый объект в reactive, так же, как и старый.
    Ответ написан
    Комментировать
  • Почему массивы выводятся именно так?

    0xD34F
    @0xD34F
    Через запятую указываются не конкретные индексы, а задаётся интервал индексов. Первое число - начальный индекс, второе - сколько элементов надо взять. Читайте документацию.
    Ответ написан
    Комментировать
  • Почему не изменяется значение в Vuex?

    0xD34F
    @0xD34F Куратор тега Vue.js
    По клику на кнопку вызывается мутация, в которою передаётся id.

    Эти слова следовало проиллюстрировать кодом. Потому что сама по себе показанная вами мутация... дичь дикая конечно, но рабочая, проблема где-то в другом месте - может, неправильно вызываете мутацию, или не ту, или при вызове передаёте несуществующий id.

    Я так понимаю, потому что метод возвращает только false/true, а не измененный item.

    Не понимаете. Какая разница, что вы там из мутации возвращаете? Да никакой.

    Как примерно должен был выглядеть ваш код. Смотрите, сравнивайте с тем, что у вас реально есть.

    UPD. Вынесено из комментариев:

    id передается, проверял через консоль

    ...mapMutations(['chekedItem', 'deleteItem']),
    itemSucces(id) {
      this.chekedItem({id});
    },

    Правда проверяли? И как же вы ухитрились при этом не заметить, что передаёте объект вместо числа? Кстати, в данной ситуации можно и объект передавать - сам item, тогда его не придётся искать в мутации:

    chekedItem: (state, item) => item.checked = !item.checked,

    Зачем метод дополнительный создавать? - вызывайте сразу chekedItem, а itemSucces удалите.
    Ответ написан
  • Как скрыть блок комментариев к определенному ответу с jQuery и toggle?

    0xD34F
    @0xD34F Куратор тега JavaScript
    $(document).on('click', 'a[id^="answer_"]', e => $(`#comment_${e.target.id}`).toggle());
    Ответ написан
    1 комментарий
  • Почему не работает функция в Vue?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Нет никакой функции, нечему работать. Вы выполняете статическую привязку значения параметра, так что передаёте в компонент строку, а не функцию:

    succesItem='succesItem'

    А вообще, вам не мешало бы почитать документацию, чтобы узнать, как правильно в родительских компонентах обрабатывать события дочерних.
    Ответ написан
    Комментировать
  • Как добавлять id в массив lists в redux?

    0xD34F
    @0xD34F
    case 'ADD_LIST':
      const { boardId, id } = action.payload;
      return {
        ...state,
        borders: state.borders.map(n => n.boardId === boardId
          ? { ...n, lists: [ ...n.lists, id ] }
          : n
        ),
      };
    Ответ написан
    Комментировать
  • Как использовать глобальный фильтр в методах?

    0xD34F
    @0xD34F Куратор тега Vue.js
    А оно вам действительно надо? Может, это тогда не фильтр должен быть? Подумайте об этом.

    Глобальные фильтры лежат в Vue.options.filters. Соответственно:

    const filteredValue = Vue.options.filters.someFilter(value);
    
    // или, если вспомнить, что компоненты являются экземплярами Vue
    const filteredValue = this.constructor.options.filters.someFilter(value);
    Ответ написан
    Комментировать
  • Как из строки вытянуть дату?

    0xD34F
    @0xD34F
    preg_match_all('~\b\d{2}-\d{2}-\d{4}\b~', $str, $matches);
    Ответ написан
    4 комментария
  • Как изменить значение в объекте по его пути?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Вот так:

    function setNested(root, ...args) {
      const val = args.pop();
      const key = (args = args
        .flat(Infinity)
        .flatMap(n => typeof n === 'string' ? n.split('.') : n))
        .pop();
    
      args.reduce((p, c) => p[c] ??= {}, root)[key] = val;
    }

    setNested(data, '0.arr.0.str', 'hello, world!!');
    setNested(data, 0, 'arr', 1, 'num', 666);

    Интересуют готовые решения

    https://lodash.com/docs/4.17.15#set

    А вообще, учитывая что за задачу вы пытаетесь решить...

    Нужно изменить этот массив, преобразовав все строки с датами в нём, независимо от того, как глубоко они вложены, в объекты.

    ...вам ничего из того, что выше, не нужно. Делаем функцию, которая рекурсивно обойдёт переданный объект, проверяя, чем являются значения - если строкой с датой, то выполняет указанное преобразование:

    const replaceNested = (val, replacer) =>
      val instanceof Object
        ? Object.entries(val).reduce((acc, [ k, v ]) => (
            acc[k] = replaceNested(v, replacer),
            acc
          ), val.constructor())
        : replacer(val);

    const newData = replaceNested(
      data,
      x => typeof x === 'string' && /^\d{2}\.\d{2}\.\d{4}$/.test(x)
        ? new Date(x.split('.').reverse().join('-'))
        : x
    );
    Ответ написан
    Комментировать
  • Как посчитать проценты?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Откуда брать значения и куда записывать их процентный эквивалент:

    const valueKey = 'number';
    const percentKey = 'percent';

    Что такое процент - отношение конкретного значения и суммы всех значений, умноженное на сто:

    const sum = arr.reduce((acc, n) => acc + n[valueKey], 0);
    const getPercent = n => n[valueKey] / sum * 100;

    Собираем новый массив или обновляем существующий:

    const newArr = arr.map(n => ({ ...n, [percentKey]: getPercent(n) }));
    
    // или
    
    arr.forEach(n => n[percentKey] = getPercent(n));
    Ответ написан
    1 комментарий