• Как записать рекурсию (функц. глубокого копирования) в виде цикла?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Самый простой вариант клонировать обьект это конвертировать его в JSON, а потом обратно. Другое дело, что это не подойдет, если в объекте есть типы данных, которые нельзя представить внутри JSON. Вам обязательно цикл нужен?
    Ответ написан
    2 комментария
  • Как записать рекурсию (функц. глубокого копирования) в виде цикла?

    0xD34F
    @0xD34F
    Используйте стек.

    Если, обрабатывая данные, натыкаетесь на объект, надо сохранить в стек текущее состояние - ссылку на копируемые данные, индекс текущего элемента, ссылку на объект, куда копируете; затем установить новое состояние - копируемыми данными будет массив пар ключ-значение встреченного объекта, индекс обнуляется (на самом деле надо выставить -1, нулевое значение будет получено при переходе к следующей итерации; конечно, можно и буквально 0 выставлять, но тогда придётся усложнить работу с индексом - тут увеличиваем, а тут нет), пустой объект в качестве копии.

    Если данные закончились, надо восстановить состояние из стека.

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

    function clone(value) {
      const clone = {};
      const stack = [];
    
      for (
        let i = 0, source = [ [ '', value ] ], target = clone;
        i < source.length || stack.length;
        i++
      ) {
        if (i === source.length) {
          [ i, source, target ] = stack.pop();
        } else {
          const [ k, v ] = source[i];
          const isObject = v instanceof Object;
    
          target[k] = isObject ? v.constructor() : v;
    
          if (isObject) {
            stack.push([ i, source, target ]);
            [ i, source, target ] = [ -1, Object.entries(v), target[k] ];
          }
        }
      }
    
      return clone[''];
    }

    Или, если в копируемом объекте могут быть циклические ссылки или какой-то из вложенных объектов встречается несколько раз и так же должно быть и в копии, то надо запоминать встреченные объекты, чтобы не обрабатывать их повторно - воспользуемся Map'ом, где ключами будут оригинальные объекты, а значениями их копии.

    Как выглядит получение копии объекта: проверяем, встречался ли указанный объект ранее, если нет - создаём новый объект, сохраняем его в Map, а также кладём его вместе с оригиналом в стек, для последующей обработки; достаём из Map'а копию.

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

    function clone(value) {
      const stack = [];
      const clones = new Map;
      const getClone = val => val instanceof Object
        ? (clones.has(val) || stack.push([ val, clones.set(val, val.constructor()).get(val) ]),
           clones.get(val))
        : val;
    
      for (getClone(value); stack.length;) {
        const [ source, target ] = stack.pop();
        Object.entries(source).forEach(n => target[n[0]] = getClone(n[1]));
      }
    
      return getClone(value);
    }

    как правильнее всего будет это сделать?

    Перестать заниматься ерундой и начать использовать готовые решения - structuredClone или cloneDeep, например.
    Ответ написан
    Комментировать
  • Как сделать возможность игры в Minecraft прямо из браузера?

    @acwartz
    Тут должна быть ваша реклама.
    Всё просто - написать на WebAssembly & WebGL & WebSockets копию игрового клиента, и запускать её в браузере. Можно конечно на javascript'е выехать, но увы, производительность будет не ахти, ровно как и потребление ресурсов. И да, обычные модификации тоже придется полностью переписать на этот тех. стэк, по сути встроить в новый игровой клиент. на гитхабе кучи вариантов реализации маинкрафт-клиента на том же openGL (который родной для маинкрафта если что) и C++ вместо джавы. И подумать над тем, что браузер просто не имеет нормального доступа к файловой системе.
    Ответ написан
    Комментировать
  • Как сделать возможность игры в Minecraft прямо из браузера?

    @rPman
    Раньше было можно, официально, через java applet (посмотри вроде тут обсуждалось что подсовывать и как)

    Теперь этот режим отключен в браузерах по умолчанию, так как еще более ненадежный чем flash (проблем больше чем пользы)
    Ответ написан
    Комментировать
  • Как сделать возможность игры в Minecraft прямо из браузера?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Самый простой и дешёвый (из всех возможных) вариант это сделать - написать свой майнкрафт. В качестве примера могу привести minecraft classic, который сделали на 10-летие майнкрафта.
    Ответ написан
    Комментировать
  • Как сделать возможность игры в Minecraft прямо из браузера?

    @mxrdxfxrrx
    flstudio20, py3.x
    У меня один вопрос - как ты собрался играть в java(почти) игру, .exe приложение в БРАУЗЕРЕ?
    Может ты имел ввиду "хостинг"?
    Ответ написан
    3 комментария
  • Как сделать возможность игры в Minecraft прямо из браузера?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Я конечно не занимаюсь геймдевом, но чтобы играть в браузере вам нужна клиентская часть не на Java, а на JavaScript. А в качестве бекенда можно взять Java. Так вот, просто так адаптировать игру не получится... разве что переписать ее на JS. Но если у вас подобные вопросы, то явно вашего текущего уровня не хватит, чтобы это сделать...
    Ответ написан
    5 комментариев
  • Как сделать возможность игры в Minecraft прямо из браузера?

    MinTnt
    @MinTnt
    Напрямую - вряд ли что-то дельное да выйдет.

    Максимум лишь за некую сумму денег купить VDS и настроить по типу playkey. Чтоб потом в браузере, выделять некую сессию. А на самой странице, в кабинете сессии, сделать трансляцию видео с выделенного сервера, и кнопки для управления. Но предполагаю задержка выйдет значительная. Да и затраты себя не окупят.
    Ответ написан
    Комментировать