• Можно ли устроиться миддлом без опыта работы?

    @dimoff66
    Кратко о себе: Я есть
    Здесь два вопроса в одном:

    1) Как можно стать миддлом? Миддл это не знание технологий, это прежде всего умение писать некривой код. Если хоть на одном языке ты этому научился, ты никогда больше не будешь джуном, даже если про новую технологию прочитал два дня назад. Сколько уходит на то, чтобы научиться писать некривой код? Это как научиться плавать - в зависимости от личных качеств и обстоятельств от полугода до полувека. У меня это заняло давным давно два года одинэсником.

    2) Можно ли устроиться на работу миддлом? Это вопрос чистой психологии. Зависит от того, насколько грамотен тот, кто ищет миддла, насколько глубоко он готов вас тестировать, насколько вы способны обмануть(а может не обмануть а реально соответствовать) и убедить его что соответствуете его ожиданиям. Это вполне возможно в небольших конторах, где нет устоявшейся системы тестирования.

    Другой вопрос в чем смысл? В лишних деньгах? Но вам придется выдавать себя за того, кем вы не являетесь а это лишнее напряжение. Лучше наоборот пожертвовать деньгами и выполняя работу спокойно учиться, спокойно изучать область, не пытаясь пускать пыль в глаза. Тогда вы быстро станете миддлом и можно перейти на следующую ступень: "Ребят, такой вопрос: можно ли сразу на собесах устроиться сеньбором"
    Ответ написан
    3 комментария
  • Как сохранять состояние между запросами для каждого пользователя?

    @dimoff66
    Кратко о себе: Я есть
    Что означает "будет запускать все приложение заново"? Если каждый раз идет перезагрузка страницы, сервер может вшить в нее любую информацию, в том числе и о требуемом сдвиге. Если же страница статична и перезагрузка идет через SPA или AJAX, то информацию о сдвиге меняет сама страница.
    Ответ написан
    Комментировать
  • Как правильно выводить в state ответ от сервера react?

    @dimoff66
    Кратко о себе: Я есть
    Да. Все что влияет на отрисовку компонента и меняет значение за время жизненного цикла, должно быть внутри стейт
    Ответ написан
    Комментировать
  • Работа с substring. Как изменить текст внутри string?

    @dimoff66
    Кратко о себе: Я есть
    Вариант с поиском строковыми функциями

    function replaceSubstring(string, words, substring) {
      // Получаем слова между которыми искать замену
      const [word1, word2] = words.split(' ')
    
      // Находим индексы этих слов
      const [pos1, pos2] = [string.indexOf(word1), string.indexOf(word2)]
      if (pos1 < 0 || pos1 + word1.length >= pos2) return string 
    
      // Добавляем пробелы в строку замены, если отсутствуют
      if (!substring.startsWith(' ')) substring = ' ' + substring
      if (!substring.endsWith(' ')) substring += ' '
    
      // Возвращаем новую стрроку с итерационным вызовом, так как могут быть и другие вхождения
      return string.substring(0, pos1 + word1.length) + 
        substring + 
        word2 +
        replaceSubstring(string.substring(pos2 + word2.length), words, substring)  
    }


    Вариант с поиском через регулярные выражения

    function replaceSubstring2(string, words, substring) {
      if (!substring.startsWith(' ')) substring = ' ' + substring
      if (!substring.endsWith(' ')) substring += ' '
    
      const regex = words.replace(' ', '.+?')
      return string.replaceAll(new RegExp(regex, 'g'), words.replace(' ', substring))
    }
    Ответ написан
    Комментировать
  • Как найти все дубликаты в многомерном массиве?

    @dimoff66
    Кратко о себе: Я есть
    Если предположить что пользоваться методами работы с массивами вы умеете, то алгоритмически решение будет выглядить так:

    1) Сделайте массив плоским
    [
      ['alex', '111111'],
      ['alex', 2222222],
      ...
    ]


    2) Сгруппируйте по номеру телефона, чтобы получилось
    [
      '111111' => ['alex', 'john'],
      '222222' => ['alex']
      ...
    ]


    3) Отфильтруйте элементы где значение имеет больше одного элемента.

    Задача сделана

    UPDATE:
    Простой код

    $data = [
      'alex' => [
        "1111111",
        "2222222",
        "1726354"
      ],
      'john' => [
        "1111111",
        "3333333",
        "7162534"
      ],
      'michel' => [
        "1111111",
        "453453453",
        "3333333"
      ]
    ] ;
    
    $res = [];
    foreach ($data as $name => $phones) {
        foreach($phones as $phone) {
            if (!array_key_exists($phone, $res)) {
                $res[$phone] = [];
            }
            $res[$phone][] = $name;
        }    
    }
    
    print_r($res)


    Array
    (
        [1111111] => Array
            (
                [0] => alex
                [1] => john
                [2] => michel
            )
    
        [2222222] => Array
            (
                [0] => alex
            )
    
        [1726354] => Array
            (
                [0] => alex
            )
    
        [3333333] => Array
            (
                [0] => john
                [1] => michel
            )
    
        [7162534] => Array
            (
                [0] => john
            )
    
        [453453453] => Array
            (
                [0] => michel
            )
    
    )
    Ответ написан
    7 комментариев
  • Как организовать общение между базой данных 1с и django?

    @dimoff66
    Кратко о себе: Я есть
    При такой постановке вопроса сложностей вообще нуль. Со стороны django делаете api отдающий данные по остаткам по соответствующему адресу. Со стороны 1С делаете get или post запрос и обрабатываете полученный результат.

    Соединение = Новый HTTPСоединение("djangobasepath.com", 80 );
    Ответ = Соединение.Получить(Новый HTTPЗапрос("/v8exchange/get"));
    Данные = Ответ.ПолучитьТелоКакСтроку());


    Далее читаете данные. Если это JSON - Переводите в JSON, примеров полно. И записываете в базу 1С.
    Ответ написан
    3 комментария
  • Как понять что ты знаешь javascript и готов приступить к изучению фреймворков?

    @dimoff66
    Кратко о себе: Я есть
    Один мальчик не зная javascriipt-а приступил к фреймворкам, нашел себе работу, дорос до тимлида, создал свои курсы, так и не поняв, что он не знал javascript и совершенно не был готов к изучению фреймворка. А время то не вернешь.

    PS Если говорить серьезно, то доказательство существования пудинга в его вкусе. Если пишете работающий код на js - значит знаете на уровне, достаточном для фреймворка. Процесс познания почти бесконечен. Поэтому какой-то точки, где можете сказать "Да, теперь я знаю" не существует. просто получайте удовольствие от изучения и программирования и не парьтесь знаете вы что-то или нет.
    Ответ написан
    Комментировать
  • Какие проекты JavaScript отлично иметь в своём портфолио?

    @dimoff66
    Кратко о себе: Я есть
    Можно React или другое SPA выучить в качестве дополнения к своему резюме и для собственного развития и уже на них делать небольшие проекты, демонстрирующие навыки.
    Ответ написан
    Комментировать
  • Как выбирать у кого заказывать создание сайта?

    @dimoff66
    Кратко о себе: Я есть
    Я бы не делал это через гугл и вообще через агентства, потому что платя агентству вы платите и все административные расходы. Лучше найти сайты фрилансеров и смотреть отзывы, если человек сделал 10 людям подобные сайты и все довольны или почти довольны, то шанс что в вашем случае будет иначе минимален. Естественно единственный критерий близкий к реальности это отзывы, никак не результат в выдаче.
    Ответ написан
    Комментировать
  • Составить алгоритм перебора вариантов с весом?

    @dimoff66
    Кратко о себе: Я есть
    Если перестановки не нужны, то все просто. Каждый элемент либо входит в следующий вариант, либо нет. Соответственно делаете цикл 1 до pow(2, count($arr)). Преобразовываете каждое число цикла в двоичное встроенной функцией decbin, переворачиваете результат, и по нему составляете новый вариант - если 1 на соответствующем месте возвращенной decbin строки, то включаете элемент, если 0, то исключаете.

    $arr = [0 => 'a', 1 => 'b', 2 => 'c'];
    $res = [];
    
    for ($i = 1; $i < pow(2, count($arr)); $i++ ) {
        $bin = decbin($i);
        $case = "";
        foreach(str_split(strrev($bin)) as $ind => $symb) if ($symb == "1") $case .= $arr[$ind];
        $res[] = $case;
    }
    
    echo implode(", ", $res); // a, b, ab, c, ac, bc, abc
    Ответ написан
    Комментировать
  • Следующее наименьшее число. Как упростить нахождение второго индекса?

    @dimoff66
    Кратко о себе: Я есть
    Ну естественно. По логике нахождения первого числа можно понять, что все числа после него идут в порядке возрастания, поэтому из реверса находите индекс первого числа которое меньше forv[idx1] и все. Естественно с экранированием на нормальный порядок.

    По той же причине после перестановки сортировка чисел в обратном порядке не требуется, достаточно реверса.

    К тому же forv тут вообще не нужен, достаточно rev

    function nextSmaller(n){
      const rev = [...`${n}`].map(Number).reverse()
      const idx1 = rev.findIndex((v, i, a) => i && a[i-1] < v)
    
      if (idx1 < 0) return idx1
    
      const idx2 = rev.slice(0, idx1).findIndex(v => v < rev[idx1])
      if (idx2 < 0) return idx2;
    
      [rev[idx1], rev[idx2]] = [rev[idx2], rev[idx1]]
       
      const nn = +rev.slice(idx1).reverse().concat(rev.slice(0, idx1)).join('')
      return nn
    }
      
    console.log(nextSmaller(133232766512347)) //133232766475321
    Ответ написан
    2 комментария
  • Имеет ли смысл TypeScript, если на том же backend php?

    @dimoff66
    Кратко о себе: Я есть
    1) Что вы получаете на выходе в js - вообще никого не волнует, минифицированный код никто в здравом уме ни читать ни править не станет. Вся типизация - это контроль за порядком во время разработки.

    2) PHP может вернуть только один тип данных - строку. Если она в формате json - то типы в json одинаковы для всех языков и при JSON.parse будут преобразованы в типы js.

    Так что не переживайте, смело подключайте TS, типизация дело хорошее, тем более что в сравнении с такими языками как Java или C# в TS она весьма щадящая.
    Ответ написан
    Комментировать
  • Как сравнить табличные части документов?

    @dimoff66
    Кратко о себе: Я есть
    Самое простое запросом. Что-то вроде

    "ВЫБРАТЬ 
      Номенклатура, 
      СУММА(Количество)
    ИЗ (
      ВЫБРАТЬ Номенклатура, Количество 
      ИЗ Документ.РТиУ.Номенклатура ГДЕ Ссылка = &РТиУ
      ОБЪЕДИНИТЬ ВСЕ
      ВЫБРАТЬ Номенклатура, - Количество 
      ИЗ Документ.СФ.Номенклатура ГДЕ Ссылка = &СФ
    )
    СГРУППИРОВАТЬ ПО Номенклатура 
    ИМЕЮЩИЕ СУММА(Количество) <> 0"
    Ответ написан
    Комментировать
  • Как сортировать с приоритетом массив?

    @dimoff66
    Кратко о себе: Я есть
    С гибкими правилами

    function getSortBy(arr, rules = ['10', '110', 220]) {
      const groupedMap = arr.reduce((agg, v) => {
        if (!agg[v.groupId]) agg[v.groupId] = []
        agg[v.groupId].push(v)
        return agg
      }, {})
    
      const groups = Object
        .values(groupedMap)
        .map(arr => arr.sort((a, b) => b.source - a.source))
    
      const indexedGroups =
        groups
          .map(arr => ({ 
            arr, 
            sortIndex: (rules.indexOf(arr.map(v => v.source).join('')) + 1) || 1000
          }))
    
      const sortedGroups =
        indexedGroups.sort((a, b) => a.sortIndex - b.sortIndex)
    
      const firstGroup = sortedGroups[0].arr
      const element = firstGroup.find(v => v.source === 0)
    
      return element
    }
    
    const arr = [
      {id: 1, groupId: 100, source: 1},
     {id: 2, groupId: 100, source: 2},
     {id: 3, groupId: 100, source: 1},
     {id: 4, groupId: 200, source: 1},
     {id: 5, groupId: 200, source: 0},
     {id: 6, groupId: 300, source: 1},
     {id: 7, groupId: 300, source: 0},
     {id: 8, groupId: 300, source: 1},
     {id: 9, groupId: 400, source: 1},
     {id: 10, groupId: 400, source: 0},
     {id: 11, groupId: 400, source: 0},
     {id: 12, groupId: 500, source: 2},
     {id: 13, groupId: 500, source: 1},
    ];
    
    console.log(getSortBy(arr))  // { groupId: 200, id: 5, source: 0 }
    
    const arr2 = [
       {id: 1, groupId: 100, source: 1},
      {id: 2, groupId: 100, source: 2},
      {id: 3, groupId: 100, source: 1},
      {id: 4, groupId: 200, source: 1},
      {id: 5, groupId: 200, source: 2},
      {id: 6, groupId: 300, source: 1},
      {id: 7, groupId: 300, source: 0},
      {id: 8, groupId: 300, source: 1},
      {id: 9, groupId: 400, source: 1},
      {id: 10, groupId: 400, source: 2},
      {id: 11, groupId: 400, source: 2},
      {id: 12, groupId: 500, source: 2},
      {id: 13, groupId: 500, source: 1},
    ];
    
    console.log(getSortBy(arr2)) // { groupId: 300, id: 7, source: 0 }
    Ответ написан
    3 комментария
  • Как извлечь объекты из массива в новый объект?

    @dimoff66
    Кратко о себе: Я есть
    let customKeys 
    const items = Array.from(['custom', 'default']).flatMap(group => {
      const scope = group + "Data"
    
      // Собираем элементы группы
      const items = (data[group] || []).flatMap(({ id, links }) => 
        links.map(link => ({...link, id, scope }))
      )
    
      const getKey = v => JSON.stringify([v.id, v.number])
    
      if (!customKeys) {
        // индексируем ключи кастомных элементов
        customKeys = items.reduce((agg, v) => 
          Object.assign(agg, {[getKey(v)]: v})
        , {})
    
        return items 
      } else {
        // Для ключей, найденных ранее, устанавливаем родителя и отфильтровываем
        const defaultIds = []
        const defaultItems = items.filter(v => {
          const child = customKeys[getKey(v)]
          if (child) {
            child.parent = v 
            defaultIds.push(v.id)
          } else {
            return true
          }    
        })
    
        // Оставляем в data.default лишь элементы с id, не найденные в custom
        if (defaultIds.length) {
          const idsSet = new Set(defaultIds)
          const copy = [...data.default]
          data.default.length = 0 
          data.default.push(...copy.filter(v => !idsSet.has(v.id)))
        }
    
        return defaultItems
      }
    })
    
    console.log(data) // Дата без кастомных ключей в дефолт скоуп
    console.log(items) // Результат
    Ответ написан
    1 комментарий
  • Обучение Frontend разработки от GeekBrains с оплатой после обучения. Был опыт?

    @dimoff66
    Кратко о себе: Я есть
    По моему смысла нет, слишком дорого. Я бы порекомендовал htmlacademy, если нужен наставник, либо udemy - агрегатор видеокурсов с возможностью консультации у автора и отзывами, которые показывают качество курса. В периоды распродаж, которые бывают очень часто, курсы на udemy просто копеечные, главное внимательно читать отзывы перед покупкой.
    Ответ написан
    2 комментария
  • Какой алгоритм выбрать?

    @dimoff66
    Кратко о себе: Я есть
    const data = [
       "Пн 02:15 - Пн 07:40", 
       "Пн 04:20 - Пн 06:00", 
       "Пн 06:30 - Пн 09:15", 
       "Пн 09:50 - Пн 15:00", 
       "Пн 17:00 - Вт 23:20"];
    
    const weekDays = ["Пн", "Вт", "Ср", "Чт", "Пт", "Сб", "Вс"]
    
    const periods = data
      .map(v => 
           v
             .split(" - ")
             .map(v => 
              String(weekDays.indexOf(v.substring(0, 2))) + 
              v.substring(2)
            )
       )
      .sort((a, b) => {
        if (a[0] < b[0]) return -1 
        if (a[0] > b[0]) return 1
        return 0
      })
     .concat([["6 23:59", ""]]) 
    
    const freePeriods = periods.reduce((agg, period) => {
      if (period[0] > agg.lastOccupied) agg.freePeriods.push([agg.lastOccupied, period[0]])
      if (agg.lastOccupied < period[1]) agg.lastOccupied = period[1]
      return agg
    }, { freePeriods: [], lastOccupied: "0 00:00"} )
    .freePeriods 
    .map(v => 
         v.map(v => weekDays[v[0]] + v.substring(1)).join(" - ")
        ) 
    
    console.log(freePeriods) // ["Пн 00:00 - Пн 02:15", "Пн 09:15 - Пн 09:50", "Пн 15:00 - Пн 17:00", "Вт 23:20 - Вс 23:59"]
    Ответ написан
  • Почему массив глобальной переменной стал пустым вне функции?

    @dimoff66
    Кратко о себе: Я есть
    Потому что вы заполняете его внутри callback-а, который на момент вывода console.log(arrName)
    еще не был вызван.
    Поставьте вывод после строчки
    arrName.push(array_2);

    чтобы убедиться, что сначала выводится пустой массив, а потом уже он начинает заполняться
    Ответ написан
    Комментировать
  • Можно ли подставить в IN строку sql запросе?

    @dimoff66
    Кратко о себе: Я есть
    Любой поиск подстроки подойдет, например
    WHERE POSITION(id IN products.id_categories) > 0
    или лучше
    WHERE POSITION(CONCAT(',', id, ',')  IN CONCAT(',', products.id_categories, ','))  > 0


    Но не будет работать индексация, если скорость критична то лучше вторую таблицу
    Ответ написан
  • Как правильно реализовать ассинхронный цикл в node.js?

    @dimoff66
    Кратко о себе: Я есть
    Если без блокировки await, то как-то так

    const promise = axios.get('https://jsonplaceholder.typicode.com/todos/1')
    promise
    .then(response => ({ response, items: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] }))
    .then(nextThen)
    .catch(console.log)
    
    const nextThen = ({ response, items }) => {
      if (!items.length) {
        console.log(response)
        return
      }
      const [nextValue, ...rest] = items
      promise
        .then(item =>  axios.get(`https://jsonplaceholder.typicode.com/users/${item}`))  
        .then(res => {
          fs.writeFileSync('test.json', JSON.stringify(res.data.phone, null, 2))
          return ( { response, items: rest })
        })
        .then(nextThen)
      return nextValue
    }
    Ответ написан
    Комментировать