• Чем заменить eval для простых выражений?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Можно сделать так. Только на выходе будет строка.

    var res = `${x > 5 && (y == 7.5)}`;

    https://jsfiddle.net/jey5xs2r/1/

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

    А это пример использования для вашей задачи:
    код
    const Splitter = require("split-tools");
    
    var text = "x > 5 && (y == 7.5) || sin(Math.PI*a/360) || true";
    
    const splitter = new Splitter({
        matchers: {
            function: /\s*([a-z]\w*)\(\s*(.*)\s*\)/g,
            bracket: /\(\s*(.*)\s*\)/g,
            operator: /\s*(\>|\<|\=\=|\!\=|\&\&|\|\||\+|\-|\*|\/|\%)\s*/g,
            variable: /\s*([a-z][\w\.]*)\s*/gi,
            sting: /\s*\"(.*?)\"\s*/gi,
            boolean: /\s*(true|false)\s*/gi,
            value: /\s*(\d[\d\.]*)\s*/gi
        }
    });
     
     
    const tree = {
        "brackets": ["function", "bracket", "operator", "variable", "sting", "boolean", "value"]
    };
     
    function subSplit(id, text) {
        console.log("subSplit:", id, "[", text, "]");
        if(tree[id] && tree[id].length)
            return splitter.process(text, tree[id]);
        return text;
    }
     
     
    splitter.addParser("function",(match,name,body)=>{
        return {
            type: "function",
            name: name,
            body: subSplit("brackets", body)
        };
    });
    
    splitter.addParser("bracket",(match,body)=>{
        return {
            type: "bracket",
            body: subSplit("brackets", body)
        };
    });
    
    splitter.addParser("operator",(match,body)=>{
        return {
            type: "operator",
            body: body
        };
    });
    
    splitter.addParser("variable",(match,body)=>{
        return {
            type: "variable",
            body: body
        };
    });
    
    splitter.addParser("string",(match,body)=>{
        return {
            type: "string",
            body: body
        };
    });
    
    splitter.addParser("boolean",(match,body)=>{
        return {
            type: "boolean",
            body: !!body
        };
    });
    
    splitter.addParser("value",(match,body)=>{
        return {
            type: "value",
            body: +body
        };
    });
     
     
    const list = splitter.process(text, tree.tags);
     
    console.log("\n\nresult:\n",JSON.stringify(list, null, '  '));



    На выходе из парсера будет массив пройдясь по которому можно будет вычислить значение распарсенного математического выражения:
    результат
    [
      { "type": "variable", "body": "x" },
      { "type": "operator", "body": ">" },
      { "type": "value", "body": 5 },
      { "type": "operator", "body": "&&" },
      { "type": "bracket", "body": [
          { "type": "variable", "body": "y" },
          { "type": "operator", "body": "==" },
          { "type": "value", "body": 7.5 }
        ]
      },
      { "type": "operator", "body": "||" },
      { "type": "function", "name": "sin",   "body": [
          { "type": "variable", "body": "Math.PI" },
          { "type": "operator", "body": "*" },
          { "type": "variable", "body": "a" },
          { "type": "operator", "body": "/" },
          { "type": "value", "body": 360 }
        ]
      },
      { "type": "operator", "body": "||" },
      { "type": "variable", "body": "true" }
    ]
    Ответ написан
  • Как укоротить строку?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Можно как то так сделать:
    parseUserName = userName => {
        const splitted = userName.split(/\s+/);
        return splitted[0]+" "+splitted[1][0]+".";
    };


    Ответ написан
    Комментировать
  • Как запустить bat файл от имени админа или exec на node.js в windows?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Запустите ваш index.js под админом
    runas /user:username "node index.js"

    Где username имя пользователя-администратора
    Ответ написан
    3 комментария
  • Как вывести различия между двумя многомерными массивами в javascript?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Или руками:


    А при одинаковом порядке следования и одинаковых индексах элементов можно еще упростить:
    Ответ написан
    Комментировать
  • Как сделать валидацию формы с применением JSON?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Для этих целей существует json-schema.
    Описание дано в спецификации.

    Ознакомится можно прочитав ряд статей:


    погуглив json schema validator можно найти очень много обзоров, гайдов, отзывов и другой полезной информации по Вашему вопросу
    Ответ написан
    Комментировать
  • Как создать страницы, которые будут использовать данные из своей ссылки?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Для этих целей и существуют веб сервера с серверными скриптами и базами данных. Вместе они составляют так называемый backend. Суть бэкенда заключается в обработке запросов от клиента и формировании в ответ на эти запросы страниц либо данных, которые отдаются клиенту для дальнейшей обработки и/или отображения. В качестве сервера для бэкэнда может служить apache, nginx, express.js и др.. В качестве языка программирования для серверных скриптов может служить почти любой ЯП, но наиболее популярны PHP, python, node.js, Ruby и некоторые другие ЯП. Также существует множество бэкенд фрэймворков, написанных на различных языках. Целью этих фрэймворков служит разной степени упрощение/шаблонизация/автоматизация написания серверных скриптов.
    Привожу небольшой пример, отвечающий на ваш вопрос и иллюстрирующий данный подход. Пример написан на nodejs и использует бэкенд фрэймворк express.js

    var express = require('express');
    var app = express();
    
    app.get('/user/:user', function(req, res) {
      var user = req.params.user;
      // Тут дожны быть проверки
      // прав клиента на просмотр
      // запрашиваемых данных.
      // запросы в бд за данными пользователя,
      // и другими необходимыми данными.
      // затем для пользователя 
      // указанного в запросе формируются
      // данные для отдачи клиенту
      // это могут быть как именно данные,
      // например в формате json так и страница
      // (частично и полностью)
    
      // затем эти данные отдаются клиенту:
      res.send(data);
    });
    Ответ написан
    Комментировать
  • Как занести в переменную обрезанную ссылку, удалив всё что после ../news/?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Или так:
    link=link.replace(/(\/news\/).*/,"$1");

    Подправил чутка )
    Ответ написан
    4 комментария
  • 3D-движок для рендеринга карты высот?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    https://threejs.org точно подойдет. Инфа 146%.

    PS: вот даже примерчик имеется rainforest.arkivert.no
    Ответ написан
    Комментировать
  • Как понять сколько тредов способна выдержать node.js?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Очень часто под трэдами имеют ввиду как потоки так и параллельные процессы.

    Если под трэдами вы подразумеваете процессы, то в nodejs они реализуются с помощью worker-ов. других реализаций насколько я знаю в ноде нет. Про них немного написано тут и тут (в комментариях намекают на тесты производительности и прочего, возможно даже кто то проводил оные)
    Если же вы интересуетесь потоками, то о с ними можно немного ознакомится тут

    Для более развернутого ответа хотелось бы более развернутый вопрос.
    Ответ написан
    9 комментариев
  • Express js что не так с роутингом?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    сделайте роутер auth так:

    const express = require('express');
    const router = express.Router();
    
    router.get('/', (req, res) => res.render('/auth'));
    router.post('/', (res, req) => {
      console.log(req.body);
      res.json({
        ok: true
      });
    });
    
    module.exports = router;
    Ответ написан
    4 комментария
  • Как ускорить (скликать) таймер обратного отсчета на сайте?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Вариант скликивания секунд:
    var _Seconds = $('.timer').text(),
    var _Clicks = 0; // счетчик кликов
    int;
    int = setInterval(function() { // запускаем интервал
    if (_Seconds - _Clicks > 1) {
    _Seconds--; // вычитаем 1
    $('.timer').text(_Seconds - _Clicks); // выводим получившееся значение в блок
    } else {
    clearInterval(int); // очищаем интервал, чтобы он не продолжал работу при _Seconds = 0
         $('.div_x').addClass('xxx'); //добавляем класс на элемент 1
         $('.div_y').addClass('yyy'); //добавляем класс на элемент 2
      }
    }, 1000);


    Тут необходимо понимать, что:
    1. Обработка происходит раз в секунду, а в ситуации когда до конца осталось пара секунд можно успеть кликнуть по кнопке несколько десятков раз, но это не остановит счетчик.Пользователь все равно будет ждать ближайшего срабатывания setInterval.
    2. Для более тонкой обработки алгоритм надр менять. Доберусь до компа, накидаю код.

    PS: вот обещанное решение, в нем многое можно изменить и доработать, но оно прекрасно демонстрирует подход, который я хотел Вам показать:

    Ответ написан
    3 комментария
  • Как отловить в коде что IP заблокирован?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Таймаут реквесту поставить. Если ответ не пришел до истечения таймаута, то "не ок"
    Не знаю возможности модуля request и посмотреть нормально не могу, с телефона не удобно, поэтому могу предложить только универсальное, но не очень верное идеологически решение:

    var options = {
      url: url,
      encoding: null,
      timeout: 60*1000
    };
    
    function req(opts, cb){
      var isTimeout = false;
      setTimeout( ()=>{
         if( isTimeout) return;
         isTimeout = true;
         cb("time is out", {});
      }, opts.timeout);
      request.get(opts, function (err, res) {
      // сюда не попадает уже.. ;) виснет на запросе.
        if( isTimeout ) return;
        isTimeout = true;
        cb(err, res);
      });
    )
    
    // выполняем запрос с таймаутом в 60 сек.
    req(options, function(err, res){
        if (err) {
            console.log('не ok');
        } else {
            console.log('ok');
        }
    });


    PS: правильным решением будет делать так как это сделано в Вашем примере, но добавив в options значение таймаута. Поищите в офдоке модуля request как это делать.
    Ответ написан
    Комментировать
  • Существует ли рандомизатор текстов для {JS|JAVASCRIPT}?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Не подскажу конкретное решение, но вы можете написать самостоятельно, вот несколько ссылок, которые помогут понять как подступиться к решению этой задачи:
    1. генераторы на марковских цепях (очень простой, палится поисковыми системами):
    - aftamat4ik.ru/generator-teksta-na-cepyakh-markova
    - https://tproger.ru/translations/markov-chains/
    2. генерация на основе шаблонов, автоматизированные (не автоматические) генераторы:
    - https://airat.biz/random/ (готовая реализация на php)
    - https://a-panov.ru/download/textgen/ (готовая реализация на js)
    - www.promotools.ru/services/anchors-large.php (готовая реализация на js)
    3. генераторы на на основе грамматик и нейросетей:
    - https://habr.com/company/meanotek/blog/271965/
    Ответ написан
    5 комментариев
  • Как разбить js на файлы/модули?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Совершенно не понимаю зачем городить огород с оборачиванием в функцию предложенный Александр Косицын . Этот способ скорее подходит для модулей написанных для браузера, с целью изолировать их пространство имен.
    Предлагаю не заморачиваться, и поступить так, как показано в оф.доке express-а:
    файл с кодом роутера
    var express = require('express');
    var router = express.Router();
    
    // middleware that is specific to this router
    router.use(function timeLog(req, res, next) {
      console.log('Time: ', Date.now());
      next();
    });
    // define the home page route
    router.get('/', function(req, res) {
      res.send('Birds home page');
    });
    // define the about route
    router.get('/about', function(req, res) {
      res.send('About birds');
    });
    
    module.exports = router;
    основной файл приложения
    ...
    var birds = require('./birds');
    ...
    app.use('/birds', birds);
    ...



    PS: при этом имена и местоположение файлов роутеров весьма условная вещь. По факту вы можете давать им любые имена и укладывать в любые папки, главное не запутайтесь при их подключении. Например некий роутер отвечающий за чат лежит в папке `/routers/chat` и называется `main.js`. Чтобы его подключить, нам надо будет написать что то типа:
    ...
    var chat = require('./routers/chat/main.js');
    ...
    app.use('/chat, chat);
    ...
    Ответ написан
    2 комментария
  • Возможно ли решить задачу без циклов?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Еще 1 вариант с рекурсией (правда он уничтожает исходный массив):
    function sum(arr) {
    	var val = arr.pop();
    	if( !val ) return 0;
    	if( Array.isArray(val)) return sum(val)  + sum(arr);
    	return val + sum(arr);
    }

    демка:


    PS: так же провел тесты:
    код
    let array = [];
    
    // так как sum_2 уничтожает исходный массив, для адекватности 
    // добавил переинициализацию массива исходных данных
    
    
    
    function sum_1(arr) {
    	if (!arr.length) {
    		return 0;
    	}
    	let val = arr[0];
    	if (val instanceof Array) {
    		val = sum_1(val);
    	}
    	return val + sum_1(arr.slice(1));
    }
    
    
    function sum_2(arr) {
    	var val = arr.pop();
    	if (!val) return 0;
    	if (Array.isArray(val)) return sum_2(val) + sum_2(arr);
    	return val + sum_2(arr);
    }
    
    console.time('init array');
    for (let i = 0; i < 1000; i++) {
    	array = [
    		[1, 4],
    		[11],
    		[3, 5, 7]
    	];
    }
    console.timeEnd('init array');
    
    console.time('eval');
    for (let i = 0; i < 1000; i++) {
    	array = [
    		[1, 4],
    		[11],
    		[3, 5, 7]
    	];
    	eval(JSON.stringify(array).replace(/[^\d]+/g, '+') + '0') // 31
    }
    console.timeEnd('eval');
    
    console.time('sum recursion 1');
    for (let i = 0; i < 1000; i++) {
    	array = [
    		[1, 4],
    		[11],
    		[3, 5, 7]
    	];
    	sum_1(array);
    }
    console.timeEnd('sum recursion 1');
    
    
    console.time('sum normal');
    for (let i = 0; i < 1000; i++) {
    	array = [
    		[1, 4],
    		[11],
    		[3, 5, 7]
    	];
    	[].concat.apply([], array).reduce(function(res, item) {
    		return res + item;
    	})
    }
    console.timeEnd('sum normal');
    
    
    
    console.time('sum recursion 2');
    for (let i = 0; i < 1000; i++) {
    	array = [
    		[1, 4],
    		[11],
    		[3, 5, 7]
    	];
    	sum_2(array);
    }
    console.timeEnd('sum recursion 2');


    init array: 0.615ms
    eval: 6.717ms
    sum recursion 1: 6.927ms
    sum normal: 1.921ms
    sum recursion 2: 3.753ms

    из которых видно что второй вариант рекурсии достаточно быстрый
    Ответ написан
    Комментировать
  • Для чего var elem = options.elem; и и в чем разница и для чего в 31 строке файла JS change, и "index.html" addEventListener('change')?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Уважаемая olya_097, в представленном Вами коде нет почти ничего из заданных вопросов (1 - нет, 3-нет, 4.нет)
    попробую потелепатить, скорее всего речь идет о событийной модели браузера, и ответы вы найдете тут:
    1. телепатия мне не помогла
    2. подробно тут
    3.
    - bubbles: true - подробно тут
    - detail: +vote - по всей видимости увеличение счетчика голосования
    4. подробно тут


    PS: был не прав :)

    Павло Пономаренко, да действительно, не увидел
    olya_097, был невнимателен, примите в качестве извинения за мой наезд:

    /**
     * функция реализует логику "компонента" voter. Используется так:
     *   var voter = new Voter({
     *     elem: document.getElementById('voter')
     *   });
     * @param {object} options объект с параметрами, может содержать ключи
     *                         - elem ссылка на html элемент, содержащий в
     *                           себе кнопки уменьшения (html элемент с css 
     *                           классом class="down") и увеличения (html 
     *                           элемент с css классом class="up") а также 
     *                           элемент отображения текущего состояние (html 
     *                           элемент с css классом class="vote")
     * 
     */
    function Voter(options) {
      // делаем ссылку на html элемент короче, чтобы не писать везде options.elem
      var elem = options.elem;
    
      // получаем дочерний элемент '.vote'
      var voteElem = elem.querySelector('.vote');
    
      // устанавливаем для 'компонента' voter обработчик события 'click'
      elem.onclick = function(event) {
        if (event.target.closest('.down')) {
          // если клик был по дочернему элементу '.down'
          voteDecrease();
        } else if (event.target.closest('.up')) {
          // если клик был по дочернему элементу '.up'
          voteIncrease();
        }
      }
    
      // устанавливаем для 'компонента' voter обработчик события 'onmousedown'
      elem.onmousedown = function() {
        return false;
      };
    
      // ----------- методы -------------
    
      // функция уменьшает значение в дочернем элементе '.vote' на единицу
      function voteDecrease() {
        setVote(+voteElem.innerHTML - 1);
        // где:
        // +voteElem.innerHTML - приведение строки voteElem.innerHTML к числу
        // +1 - добавляем 1 :)
      }
    
      // функция увеличивает значение в дочернем элементе '.vote' на единицу
      function voteIncrease() {
        setVote(+voteElem.innerHTML + 1);
        // где:
        // +voteElem.innerHTML - приведение строки voteElem.innerHTML к числу
        // +1 - добавляем 1 :)
      }
    
      // функция устанавливает дочернему элементу '.vote' значение равное
      // числу, переданному в параметре vote
      function setVote(vote) {
        voteElem.innerHTML = +vote;
        
        
        // создаем кастомный объект содержащий данные о событии
        var widgetEvent = new CustomEvent(
          // указываем имя кастомного событие "change". 
          "change", 
          // передав в качестве параметровнего данные о событии
          {
            bubbles: true, // тут расписано https://learn.javascript.ru/event-bubbling#vsplytie
            detail: +vote  // поле detail кастомного объекта события widgetEvent. Содержит текущее значение счетчика (+vote приводит значение vote к числу)
    
          }
        );
        // инициируем (вызываем) у "компонента" voter созданное событие "change"
        // c параметром detail содержащим установленное количество голосов
        elem.dispatchEvent(widgetEvent);
        // данное событие в данном конкретном случае мы ловим в index.html:
        // document.getElementById('voter').addEventListener('change', function(e) {
        //   alert(e.detail);
        // });
      };
    
      // экспортируем функцию setVote в глобальное пространство имен
      this.setVote = setVote;
    }
    Ответ написан
  • Почему NaN в строке?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    у вас в функции FinalF после text.value.replace(...) остаются пробелы в строке
    замените replace



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


    ЗЫ: исправил ошибки)
    Ответ написан
    2 комментария
  • Как сверстать полукруглую границу блока?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Я не шибко силен конкретно в этом вопросе, смог изобразить только такое:

    Ответ написан
    Комментировать
  • Как вызвать функцию без одного аргумента?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Если foo всегда принимает 3 или меньше аргументов, при этом соблюдается условие: -если аргументов 2, то это a и c
    то вариант решения, не зависящий от типов переменных может быть таким:

    function foo(a, b, c) {
    	if (arguments.length === 2) {
    		c = b;
    		b = undefined;
    	}
    	// ...
           console.log(a,b,c);
    }
    foo("Ivan", "Ivanov", "Ivanovich");
    foo("Ivan", "Ivanovich");
    Ответ написан
    Комментировать