Задать вопрос
  • JavaScript (рекурсия) Как из одного массива (каталог) сделать другой (дерево)?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    function parsePath(path) {
      return path.split(',').reduce((acc, item) => {
        const [key, value] = item.split('=');
        switch(key) {
        case 'name':
          acc.name = value;
          break;
        case 'f':
        case 'g':
          acc[key].push(value);
          break;
        }
        return acc;
      }, {
        name: '',
        f: [],
        g: []
      });
    }
    
    function normalizeTree(tree) {
      return Object.keys(tree).map(label => {
        const item = tree[label];
        if(item.id) { return item; }
        const children = normalizeTree(item);
        const id = `[${children.map(({id}) => id).join(',')}]`;
        return {id, label, children};
      });
    }
    
    function reduceToTree(data) {
      return normalizeTree(data.reduce((acc, {path, id}) => {
        const {name, f, g} = parsePath(path);
        const target = f.reverse().concat(name).reduce((target, label) => {
          return target[label] || (target[label] = {});
        }, acc);
        target.id = id;
        target.label = name;
        target.g = g;
        return acc;
      }, {}));
    }
    
    console.log(reduceToTree([
      {
        "path": "name=Tel6,g=tovarov,g=catalog",
        "id": "6000",
        "name": "Tel6"
      },
      {
        "path": "name=Tel1,f=Samsung,g=tovarov,g=catalog", // f= неограниченная вложенность
        "id": "1000",
        "name": "Tel1"
      },
      {
        "path": "name=Tel2,f=Samsung,g=tovarov,g=catalog", // f= неограниченная вложенность
        "id": "2000",
        "name": "Tel2"
      },
      {
        "path": "name=Tel3,f=Galaxy,f=Samsung,g=tovarov,g=catalog", // f= неограниченная вложенность
        "id": "3000",
        "name": "Tel3"
      },
      {
        "path": "name=Tel4,f=A,f=Samsung,g=tovarov,g=catalog", // f= неограниченная вложенность
        "id": "4000",
        "name": "Tel4"
      },
      {
        "path": "name=Tel5,f=A,f=Samsung,g=tovarov,g=catalog", // f= неограниченная вложенность
        "id": "5000",
        "name": "Tel5"
      }
      // ...
    ]));
    Ответ написан
  • Как отправить форму?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Метод getElementsByTagName возвращает не один элемент, а коллекцию, у которой нет метода submit

    Возможные решения:
    1. Выбрать конкретный элемент из коллекции по индексу: form = popup.getElementsByTagName('form')[0]
    2. Выбрать конкретный элемент по селектору: form = popup.querySelector('form')
    3. Выбрать элемент по id: form = document.getElementById('wpua-edit-13')
    Ответ написан
    Комментировать
  • Как подружить модули с глобальным css?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    Модули по умолчанию, при запросе с ?no-module - без модулей
    {
      test:  /\.css$/,
      oneOf: [{
        resourceQuery: /no-module/,
        use: [{loader: 'style-loader'}, {loader: 'css-loader'}]
      }, {
        use: [{loader: 'style-loader'}, {loader: 'css-loader', options: {modules: true}}]
      }]
    }


    Без модулей по умолчанию, при запросе с ?module - модуль
    {
      test:  /\.css$/,
      oneOf: [{
        resourceQuery: /module/,
        use: [{loader: 'style-loader'}, {loader: 'css-loader', options: {modules: true}}]
      }, {
        use: [{loader: 'style-loader'}, {loader: 'css-loader'}]
      }]
    }
    Ответ написан
    Комментировать
  • Какой язык программирования?

    bingo347
    @bingo347
    Crazy on performance...
    Вот все рекомендуют Python как первый язык, а я порекомендую Rust
    - Очень строгий компилятор будет доходчиво объяснять, что Вы делаете не так, когда Вы пишите плохой код
    - Компиляция в wasm из коробки (можно для браузера код писать)
    - Если научитесь делать что-то полезное и рабочее на Rust - научитесь более-менее программировать
    Ответ написан
    1 комментарий
  • Как получить кол-во миллисекунд до завтрашнего дня?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    function getMSBeforeMidnight() {
      const d = new Date();
      const currentTimestamp = d.getTime();
      d.setDate(d.getDate() + 1);
      d.setHours(0);
      d.setMinutes(0);
      d.setSeconds(0);
      d.setMilliseconds(0);
      return d.getTime() - currentTimestamp;
    }
    Ответ написан
    3 комментария
  • Как подключить бутстрап к проекту?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    var express = require("express");
    var app = express();
    var server = require('http').createServer(app);
    var io = require('socket.io').listen(server);
    
    app.get('/bootstrap.min.css', (function() {
      // на другой машине bootstrap может установится в другое место
      // разрезолвим его путь средствами ноды и сохраним в замыкании
      var cssFile = require.resolve('bootstrap/dist/css/bootstrap.min.css');
      return function(req, res) {
        res.sendFile(cssFile);
      };
    })());
    
    app.get('/', function(request, response){
      response.sendFile(__dirname + "/index.html");
    });
    
    server.listen(3000);

    ну и в html теперь путь поправим:<link rel="stylesheet" href="/bootstrap.min.css">
    Ответ написан
    1 комментарий
  • Если true выводит false а если false выводит true замыкание, что не так?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Давайте разберем все по строчкам, что Вы тут понаписали:
    function toggleMe() {
      // я кажется начинаю понимать ОТ кого придумали typescript...
      var a = 0; // если логика подразумевает логический тип, зачем init-значение число?
      return function() {
        if(a = true) { // это условие всегда будет истинно, независимо от a, в a сохраним значение true
          a = false;
        } else if (a = false) { // в принципе тоже что и выше, но еще этот код не достижим
          a = true;
        }
        return a;
      }
    }
    var a = toggleMe(); // в a извлекли функцию с замыканием
    var b = a(); // в b будет false
    console.log(b);
    console.log(b); // а второй лог что-то меняет? нет

    Теперь давайте посмотрим, что произойдет, когда данный код попадет в современный движок JS:
    1.
    function toggleMe() {
      var a = 0;
      return function() {
        if(a = true) {
          a = false;
        } else a = false /* удаляем недостижимый код if (a = false) {
          a = true;
        } */
        return a;
      }
    }

    2.
    function toggleMe() {
      var a = 0;
      return function() {
        a = true
        a = false;
    /* этот if разворачивается однозначно
        if(a = true) {
          a = false;
        } else a = false */
        return a;
      }
    }

    3.
    function toggleMe() {
      var a = 0;
      return function() {
        return false;
    /* незачем это вычислять каждый раз, все и так однозначно
        a = true
        a = false;
        return a; */
      }
    }

    4.
    // если вызвать этот код несколько раз:
    var a = toggleMe();
    var b = a();
    console.log(b);
    console.log(b);
    
    // то оптимизатор в конце концов сократит его до
    console.log(false);
    console.log(false);
    // а функцию выкинет совсем


    P.S. возможно имелось в виду это:
    function toggleMe() {
      var a = false;
      return function() {
        return a = !a;
      };
    }
    
    var b = toggleMe();
    console.log(b());
    console.log(b());
    Ответ написан
    3 комментария
  • Как собрать json?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Если интересен вариант с меньшими затратами по памяти и CPU чем у Александр
    const items = Array.from(
      document.getElementsByClassName('cartitem'),
      ({textContent}) => ({name: textContent})
    );
    const itemsJSON = JSON.stringify(items);
    Ответ написан
    Комментировать
  • Как распределить дочерние процессы по всем ядрам?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Если linux, то taskset
    На других ядрах (BSD, Darwin, WinNT), нужно погуглить аналоги

    А вообще, большого смысла привязываться к конкретным ядрам нет, Ваш процесс не единственный в системе, почему бы не доверить распределение по ядрам самой ОС? switch-context все равно будет, ибо помимо ваших 3х процессов будет еще несколько сотен других, не говоря уже о том, что многие из них многопоточные.

    А еще вот о чем подумайте, нода не такая уж и однопоточная. Помимо 1 потока v8 (а начиная с 10 ноды и их может быть несколько), у Вас еще от 4 до 128 потоков libuv (ибо сеть то может работать асинхронно, а вот с файловой системой приходится асинхронщину на потоках эмулировать). А еще могут быть C++ аддоны, которые порождают свои потоки. И стоит ли все это добро привязывать к 1 единственному ядру?
    Ответ написан
    Комментировать
  • Нормально ли постоянно создавать и убивать воркеры?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Все относительно.
    С одной стороны, запуск нового воркера довольно затратная операция. Браузер поднимает реальный поток ОС, поднимает в нем новый контекст движка JS, настраивает примитивы синхронизации памяти (у JS то память разделена и общение через postMessage, а у браузера на C++ память вполне себе общая, да еще и с конкурентным доступом).
    С другой, что такое ~100мс на старт воркера по сравнению с несколькими минутами решаемой им задачей?

    По итогу:
    Запускать по воркеру на каждую задачу будет работать медленнее, но реализовать проще.
    Иметь пул заранее запущенных воркеров - гораздо быстрее, но придется реализовать этот самый пул, а так же очередь задач и распределение их по пулу.
    Что больше подходит в Вашей ситуации можно сказать лишь точно зная Ваши тех.требования
    Ответ написан
    Комментировать
  • Перебрать массив?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    без учета приоритетов примерно так:
    var arr = [12, '+', 13, '/', 5, '-', 6];
    var result = 0;
    var op = '';
    for(var i = 0; i < arr.length; i++) {
      switch(typeof arr[i]) {
      case 'string':
        op = arr[i];
        break;
      case 'number':
        switch(op) {
        case '+':
          result += arr[i];
          break;
        case '-':
          result -= arr[i];
          break;
        case '*':
          result *= arr[i];
          break;
        case '/':
          result /= arr[i];
          break;
        default:
          result = arr[i];
          break;
        }
        break;
      }
    }
    console.log(result);

    если приоритеты нужны, то нужно в дерево сворачивать
    Ответ написан
    Комментировать
  • Почему не работает hover?

    bingo347
    @bingo347
    Crazy on performance...
    пробел лишний в селекторе
    &:hover {
        background-color: #f9ba48;
    }
    Ответ написан
    Комментировать
  • Codewars задача, javascript?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    ['Just th'+'row like this!',m=>new this['Er'+'ror'](m),'th'+'row',function*(){},function(){this[3]()[this[2]](this[1](this[0]))}][4]()
    Ответ написан
    Комментировать
  • Как правильно производить манипуляции с датой?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Месяца в JS считаются с 0
    (date.getMonth()) меняем на (date.getMonth() + 1)
    и будет все ок
    Ответ написан
  • Похожа ли эта строка на зашифрованную?

    bingo347
    @bingo347
    Crazy on performance...
    Это банальный UUID
    Ответ написан
    Комментировать
  • Как сделать такой вызов функций?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    function Calc() {
        let v = 0;
        const proto = {
            add(x) { v += x; },
            subtract(x) { v -= x; },
            divide(x) { x && (v /= x); },
            multiply(x) { v *= x; }
        };
        const keys = Object.keys(proto);
        const ctx = keys.reduce((acc, key) => {
            const wrap = x => ((!isNaN(x) && proto[key](Number(x))), wrap);
            return ((acc[key] = wrap), acc);
        }, {
            getResult: () => v,
            reset: () => ((v = 0), ctx)
        });
        keys.forEach(key => Object.assign(ctx[key], ctx));
        return ctx;
    }
    Ответ написан
    Комментировать
  • Что такое mod в Rust?

    bingo347
    @bingo347
    Crazy on performance...
    mod - это объявление дочернего модуля/пространства имен
    Есть 2 способа объявления - через блок и через отдельный файл:
    // через блок
    mod some_module {
      // тут изолированное пространство имен
      pub fn hello() {
        println!("Hello world");
      }
    }
    fn main() {
      some_module::hello(); // Hello world
    }
    
    // подключаем модуль из файла ./some_other_module/mod.rs или ./some_other_module.rs
    mod some_other_module;

    так же через оператор pub можно делать реэкспорт модуля целиком, делая тем самым структуру пространств имен Вашего крэйта
    Ответ написан
    Комментировать
  • Как в js находить страницу и запускать функцию при заходе на url, которого нет, но он есть, когда мы его создаем через history.push?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    1. Настроить nginx - nginx.org/ru/docs/http/ngx_http_core_module.html#t...
    2. В js при запуске запускать обработчик смены URL руками
    Ответ написан
    Комментировать
  • Лучший редактор html/css/js/php кода для встраивания на сайт?

    bingo347
    @bingo347
    Crazy on performance...
    Монако уже посоветовали, если нужно что-то более легковесное:
    https://github.com/codemirror/CodeMirror
    Ответ написан
    Комментировать