Задать вопрос
Ответы пользователя по тегу JavaScript
  • Как сложить десятичные числа в js?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    В 6-й строке
    price = $('#cart_price_' + id).html()
    попробуйте заменить на
    price = parseFloat( $('#cart_price_' + id).text())

    Вычисление total:
    var tot = 0;
    $('.total').each(function (t, e) {
      tot += Math.round(parseFloat($(e).text()) * 100);
    });
    tot /= 100;
    Ответ написан
    2 комментария
  • Как вывести в цикле от 1 до 10 без использования переменных?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно по массиву пройтись:
    Array.apply(null, {length: 10}).map(function(){console.log(1+arguments[1])})
    Тут создаётся пустой массив из 10 элементов, которым задано значение undefined, и для каждого вызывается функция, выводящая индекс элемента, увеличенный на 1, чтобы не 0..9, а 1..10.

    Или повызывать функцию:
    (function f(){
      console.log(arguments[0]);
      if( arguments[0]<10) f(arguments[0]+1);
    })(1)
    Но тут уже сама функция вроде как переменная.
    Ответ написан
    4 комментария
  • Как работает передача параметров в функцию javascript?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Это упражнение на область видимости переменных в JavaScript.

    Внутри функции test переменные a, b, c – совсем не те же, что снаружи. Называются одинаково, это сбивает с толку, но означают разное.
    Ответ написан
    Комментировать
  • JavaScript: как был этот код написали профессионалы?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Я не про, сделал бы так:

    function replaceStars(collection) {
      var i, el, re = /^(\s*\*\s*){3}$/;
      for(i = 0; i<collection.length; i++) {
        el = collection[i];
        if( el.innerHTML.match(re)) {
          el.insertAdjacentHTML('afterend', '<hr>');
          el.parentNode.removeChild(el);
        }
      }
    }
    
    replaceStars(document.querySelectorAll('.entry-content p'));
    Ответ написан
    Комментировать
  • Как отсортировать массив?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    этот список можно переставлять местами


    Элементам массива добавить новое поле ключа сортировки. При перетаскивании обновлять значения. При выводе сортировать по этому ключу.
    Ответ написан
    Комментировать
  • Как подтянуть фото методом wall.get?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Посмотрите внимательно возвращаемый wall.get() JSON: фотографии там лежат в массиве attachments.

    Т.е. надо ещё одним циклом в каждом посте перебирать эти attachments, и если type == 'photo', рисовать картинку.
    function drawNews(news){
      var html = ('');
      for(var i = 1; i < news.length; i++){
          var n = news[i];
          n.date = new Date(n.date * 1000);
    
          var images = [], tmpl = '<img src="%SRC%" alt="">';
          if( n.attachments) {
            for( var j=0; j<n.attachments.length; j++) {
              if(n.attachments[j].type !== 'photo') continue;
              images.push(
                tmpl.replace('%SRC%', n.attachments[j].photo.photo_130)
              );
            }
          }
    
          html += '<div><div style="width:300px; height:auto;"><p>'+ n.text +'</p><p>'+ n.date.toString() +'</p></div>' + images.join('') + '</div>';
      }
      $('#news').html(html);
    }
    Ответ написан
    1 комментарий
  • Как преобразовать массив в такой объект?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Надо делать пустой объект и двигаясь по массиву набивать его парами ключ-значение.
    Как только пошёл повтор ключа – это новый объект. Тот заполненный выкидываем в результат, и начинаем заполнять новый пустой.

    var arr = [
        "weather_c",
        "+30",
        "population",
        10000000,
        "city_name",
        "Los angeles",
        "weather_c",
        "+15",
        "population",
        5000000,
        "city_name",
        "Chicago"
      ];
    
    
    var data = {}
    var index = 1;
    var i, key, value;
    var obj = {}
    
    for(i = 1; i < arr.length; i+=2) {
      key = arr[i-1];
      value = arr[i];
      if( obj.hasOwnProperty(key)) {
        data[index.toString()] = Object.assign({}, obj);
        index++;
        obj = {}
      }
      obj[key] = value;
    }
    data[index.toString()] = Object.assign({}, obj);
    
    JSON.stringify(data)
    /*
    {"1": {"weather_c":"+30","population":10000000,"city_name":"Los angeles"},
    "2": {"weather_c":"+15","population":5000000,"city_name":"Chicago"}}
    */
    Ответ написан
    Комментировать
  • Как найти числа фибоначчи в заданном интервале?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Найдите первое число Фибоначчи, попадающее в диапазон, по приближенной формуле, и дальше генерите сложением.

    function fibRange( from, to) {
      if( isNaN(from) || isNaN(to) || from < 2 || from > to) {
        throw "Bad argument(s)";
      }
      
      var root5 = Math.sqrt(5), phi = (1 + root5)/2, logPhi = Math.log(phi);
      var nFrom = Math.ceil( Math.log((from - 0.5) * root5) / logPhi);
      var nTo = Math.floor( Math.log((to+0.5) * root5) / logPhi);
    
      function nthFib(n) {
        return Math.round( (Math.pow(phi, n) - Math.pow( -phi, -n)) / (2 * phi - 1));
      }
      
      var a = nthFib(nFrom);
      var result = [a];
      if( nFrom === nTo) return result;
      var i = nFrom + 1;
      var b = nthFib(i);
      while( i <= nTo) {
        result.push(b);
        b = a + b;
        a = b - a;
        i++;
      }
      
      return result;
    }
    
    
    fibRange(10,377)
    /*
    13,21,34,55,89,144,233,377
    */
    Ответ написан
    Комментировать
  • Как вывести все числа являющиеся произведением простых чисел?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Все, являющиеся произведением – это все, кроме простых.
    Значит, надо получить все числа, кроме простых, в интервале 1..1400.
    Для поиска простых в таком небольшом диапазоне подойдёт алгоритм решета Эратосфена. Чтобы не писать вам целиком готовое решение, вот код, который только получает массив простых чисел от 2 до N:

    function primes(n) {
      var i, j, isPrime = Array(n), result= [];
      for(i=2; i<n; i++) isPrime[i] = true;
      for(i=2; i * i <= n; i++) {
        if( isPrime[i]) {
          for(j = i * i; j <= n; j += i) isPrime[j] = false;
        }
      }
      
      for(i=2; i<n; i++) {
        if(isPrime[i] === true) result.push(i);
      }
      return result;
    }


    Дальше вы уж сами, пожалуйста.
    Ответ написан
    3 комментария
  • Сравнение каждый с каждым?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Понадобится два пальца.

    Один указывает сначала на самый левый элемент. Другой перебирает со следующего и дальше направо:
    ooooooooooo
    ||-->


    Затем левый сдвигаем на один вправо, и всё повторяется: справа от него второй и дальше направо идёт:
    ooooooooooo
     ||-->

    На каждом шаге сравниваем элементы массива, на которые указываем.
    Ответ написан
    Комментировать
  • Как выполнить проверку всех возможных вариантов?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Кажется, вам подойдёт такой простой алгоритм: перебрать все числа в двоичной записи от 1 до 2n, и брать те элементы строки, которым соответствует 1.

    Набросал функцию, подбирающую из данных элементов комбинацию, дающую наиболее близкую сумму к заданной:
    function nearest(arr, total) {
      var len = arr.length
        , i
        , bit
        , sum
        , n = Math.pow(2, len)
        , currDist
        , index = undefined
        , dist = undefined
        , result = []
      ;
      
      for( i = 1; i < n; i++) {
        sum = 0;
        for( bit = 0; bit < len; bit++) {
          if( i & (1 << bit)) sum += arr[bit];
        }
        
        currDist = Math.abs(total - sum);
        if( typeof dist === 'undefined' || dist > currDist) {
          index = i;
          dist = currDist;
          if( dist === 0) break;
        }
      }
      
      for(bit = 0; bit < len; bit++) {
        if( index & (1 << bit)) result.push(arr[bit]);
      }
      
      return result;  
    }
    
    nearest([1,3,4,6,8], 12) // [1,3,8]
    nearest([1,2,4,6,8], 12) // [2,4,6]
    nearest([7,9,13,19,28], 12) // [13] dist = 1
    nearest([7,9,13,19,28], 28) // [9,19] не [28] т.к. останавливается на первом найденном варианте
    Ответ написан
    Комментировать
  • Что быстрее и лучше map() или foreach() или for() в javascript?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Зачем гадать, если можно измерить. Например.
    Ответ написан
    Комментировать
  • Как работать с состояниями в приложений JavaScript?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Один из вариантов хранить их как битовую карту – одно целое число, где определённый бит что-то значит. В вашем случае первые 5 битов, например, отражают состояние чекбоксов:
    0000 0010
       │ │││┕╼ бит 0, чекбокс 0
       │ ││└── бит 1, чекбокс 1
       │ │└─── бит 2, чекбокс 2
       │ └──── бит 3, чекбокс 3
       └────── бит 4, чекбокс 4


    Так вы сможете чуть быстрее писать условия, напр.
    switch( bitmap) {
      case 0: // все выключены
        // загрузить что-то там
        break;
      case 1<<3: // включен только 3-й бит
        // загрузить что-то для 3-го чекбокса
        break;
      case 28: // вкл. 3, 4 и 5-й
      // ...
    }
    Ответ написан
    2 комментария
  • Функция сортировки массива в js?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    в документации на MDN неплохо описано назначение сортировочной функции:
    Если функция сравнения compareFunction предоставлена, элементы массива сортируются в соответствии с её возвращаемым значением. Если сравниваются два элемента a и b, то:

    Если compareFunction(a, b) меньше 0, сортировка поставит a по меньшему индексу, чем b, то есть, a идёт первым.

    Если compareFunction(a, b) вернёт 0, сортировка оставит a и b неизменными по отношению друг к другу, но отсортирует их по отношению ко всем другим элементам. Обратите внимание: стандарт ECMAscript не гарантирует данное поведение, и ему следуют не все браузеры (например, версии Mozilla по крайней мере, до 2003 года).

    Если compareFunction(a, b) больше 0, сортировка поставит b по меньшему индексу, чем a.

    Функция compareFunction(a, b) должна всегда возвращать одинаковое значение для определённой пары элементов a и b. Если будут возвращаться непоследовательные результаты, порядок сортировки будет не определён.
    Ответ написан
    Комментировать
  • Как сконвертировать плоский массив в дерево?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    1. Найти корневой элемент – в вашем случае это с наименьшим id
    2. Далее рекурсивно вызывать функцию, которая получая на вход элемент дописывает ему детей по их id.


    Чтобы быстрее по id находить весь элемент, данные в начале преобразовываются в «словарь» – объект, где свойства это id, а значения элементы.

    var data = [
    {id: 0, name: 'Main', path: '/', childs: [1,2]},
    {id: 1, name: 'One', path: '/one', childs: [3]},
    {id: 2, name: 'Two', path: '/two', childs: []},
    {id: 3, name: 'Three', path: '/one/three', childs: []}
    ];
    
    function makeTree(d) {
      var id, el, i, dict = {}, minId, r;
      
      function parseChildren(el) {
        var i, newEl;
        for( i = 0; i < el.childs.length; i++) {
          newEl = makeElement(dict[ el.childs[i] ]);
          parseChildren( newEl);
          el.children.push( newEl);
        }
        delete el.childs;
      }
      
      for( i = 0; i < d.length; i++) {
        el = d[i];
        id = el.id;
        if( typeof minId === 'undefined' || minId > id) minId = id;
        dict[id] = el;
      }
    
      r = makeElement( dict[minId] ); // root element
      parseChildren(r);
      return r;
    }
    
    function makeElement(arrElement) {
      return {
        name: arrElement.name,
        path: arrElement.path,
        childs: arrElement.childs,
        children: []
      };
    }
    
    var tree = makeTree(data);
    /* {
    	"name": "Main",
    	"path": "/",
    	"children": [{
    		"name": "One",
    		"path": "/one",
    		"children": [{
    			"name": "Three",
    			"path": "/one/three",
    			"children": []
    		}]
    	}, {
    		"name": "Two",
    		"path": "/two",
    		"children": []
    	}]
    } */
    Ответ написан
    Комментировать
  • Как мне добавить к 001 единицу и чтобы стало 002?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    1. найти позицию, с которой начинаются цифры в конце
    2. запомнить длину числа
    3. увеличить на 1 и перевести в строку
    4. при необходимости дописать нулей
    5. склеить с частью до числа
    function stringInc(s) {
      var pos = s.length - 1;
      while(pos >= 0) {
        if( Math.abs(s.charCodeAt(pos) - 52.5) < 5) pos--;
        else break;
      }
      if( ++pos >= s.length) return s; // no number
      var numLength = s.length - pos;
      var numString = (parseInt(s.substr(pos)) + 1).toString();
      if( numString.length < numLength) {
        numString = ((Array(1 + numLength).join('0')) + numString).substr(-numLength);
      }
      
      return s.substr(0,pos) + numString;
    }
    
    stringInc('abc123') // abc124
    stringInc('abc999') // abc1000
    stringInc('abc00009') // abc00010
    stringInc('009') // 010
    stringInc('9') // 10
    stringInc('aaa') // aaa
    Ответ написан
    Комментировать
  • Как правильно распарсить массив?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Создать объект со свойством areas:
    var result = { "areas": "значение для areas"}

    Взять массив из свойства "mh" исходных данных. Это запись в JSON поэтому просто пишем
    peremennaya = {...тут весь этот JSON...}
    peremennaya.mh // тут нужный массив


    Из этого массива нужно сделать новый, где каждый элемент будет содержать только два свойства: id и title. Первое берется из оригинала как есть, а второе нужно составить, собрав значения свойств элемента title и count через пробел-дефис-пробел:
    '' + el.title + ' - ' + el.count

    Когда нужно над каждым элементом массива произвести какое действие, удобен метод массивов map(). В него передаётся функция, которая, получая на вход очередное значение из массива, что-то с ним делает и возвращает новое значение.

    Итого:
    var d = {"mh": [{"id": "BR", "count": 18516, "title": "Brazil"}, 
        {"id": "US", "count": 4514, "title": "United States"}, 
        {"id": "MY", "count": 390, "title": "Malaysia"}, 
        {"id": "IT", "count": 208, "title": "Italy"}]
    };
    
    var result = {areas: d.mh.map(el => ({id:el.id, title:''+el.title+' - '+el.count}))}
    
    // {"areas":[{"id":"BR","title":"Brazil - 18516"},{"id":"US","title":"United States - 4514"},
    //   {"id":"MY","title":"Malaysia - 390"},{"id":"IT","title":"Italy - 208"}]}
    Ответ написан
    Комментировать
  • Как выбрать из текста 3 слова одинаковой или похожей (максимально приближенной) длины?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Собрать из текста словарь "длина": [слово,слово]
    Выбирать слова нужной длины, а при отсутствии смотреть соседние по значению ключи.

    words = txt.replace(/[\.,\?\!\:;\–\(\)]/g, '').toLowerCase().split(/\s+/);
    
    // make dictionary
    var db = [];
    for( var i = 0; i < words.length; i++) {
      word = words[i];
      len = word.length;
      if(db.length <= len || typeof db[len] == 'undefined') db[len] = [];
      if(!~db[len].indexOf(word)) db[len].push(word);
    }
    
    function getWords(db, length, n) {
      n = n || 3;
      var result = [], offset = 0, m;
      length = Math.max(0, Math.min(length, db.length));
      while( result.length < n) {
    
        m = n - result.length;
        if( db[length + offset]) {
          result = result.concat( getUpTo(m, db[length + offset]))
        }
    
        m = n - result.length;
        if( offset &&  m  &&  db[length - offset]) {
          result = result.concat( getUpTo(m, db[length - offset]))
        }
        
        m = n - result.length;
        if( m === 0) break;
        offset++;
        if( offset + length > db.length && offset > length) break;
      }
      
      return result;
    }
    
    function getUpTo(n, arr) {
      return arr.slice(0, Math.min(n, arr.length));
    }


    Fiddle
    Ответ написан
    1 комментарий
  • Как лучше опрашивать состояния элементов?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Т.е. на сервере что-то происходит, о чём надо оповестить клиент, и вы делаете это, опрашивая раз в секунду сервер «есть чё?», причём в несколько параллельных потоков – по каждому айтему.

    Сделайте «конец» api, с которого можно забирать сразу несколько готовых задач. Когда задача на сервере «пропадает», пихайтё её item_id в некий одноразовый массив для выдачи в клиент.

    Так хоть в один всего поток раз в секунду будете опрашивать сервер, и забирать массив с id завершенных.
    Ответ написан
    Комментировать