Ответы пользователя по тегу JavaScript
  • Проксирование изменений вложенного объекта в JavaScript?

    paramtamtam
    @paramtamtam Автор вопроса
    В общем пошел по пути не самому лучшему, но более стабильному. Все настройки привел к "плоскому" виду, и обернул всё это дело в прокси для отлова событий. Так и к опциям общения происходят "прямо" - Settings.value1, и к методам Settings.onSet. По хорошему это лютый говнокод, но как лучше сделать - ещё не придумал.

    var Settings = new Proxy({
      data: {
        value1: 'some text',
        value2: true,
      },
    
      /**
       * Callback - on any property/value read
       *
       * @param   {string} name
       * @returns {void}
       */
      onGet: function(name) {
        console.log('Property "' + name + '" read action');
      },
    
      /**
       * Callback - on any property/value write
       *
       * @param   {string} name
       * @param   {mixed} value
       * @returns {void}
       */
      onSet: function(name, value) {
        console.log('Property "' + name + '" write "' + value + '" action');
      },
    
      /**
       * Load settings from storage
       *
       * @param   {callable} callback
       * @returns {void|object}
       */
      load: function(callback) {
        // Code
      },
    
      /**
       * Save settings in storage
       *
       * @param   {callable} callback
       * @returns {void}
       */
      save: function(callback) {
        // Code
      },
    
      /**
       * Remove all settings from storage
       *
       * @param   {callable} callback
       * @returns {void}
       */
      clear: function(callback) {
        // Code
      }
    }, {
      /**
       * Getter
       *
       * @param   {object} target
       * @param   {string} name
       * @returns {mixed}
       */
      get: function(target, name) {
        var result = undefined;
        if (name in target.data) {
          result = target.data[name];
        }
        if (name in target) {
          result = target[name];
        }
        if (typeof target.onGet === 'function') {
          target.onGet.call(target, name);
        }
        return result;
      },
    
      /**
       * Setter
       *
       * @param   {object} target
       * @param   {string} name
       * @param   {mixed} value
       * @returns {mixed}
       */
      set: function(target, name, value) {
        if (name in target.data) {
          target.data[name] = value;
          // Save changes in storage
          target.save.call(target, name, value);
        }
        if (name in target) {
          target[name] = value;
        }
        if (typeof target.onSet === 'function') {
          target.onSet.call(target, name, value);
        }
        return true;
      }
    });
    Ответ написан
    Комментировать
  • Как обратиться к объекту, зная его название в виде строки?

    Если я правильно понял ваш вопрос, то знайте что к элементам объекта можно обращаться как с элементами массива. Пример:
    var source = {
    	'one': {
        id: 1,
        name: 'Name1',
      },
      'two': {
        id: 2,
        name: 'Name2',
      }};
    
    console.log(source['one']['name']);
    console.log(source['two']['name']);


    Вернет:
    Name1
    Name2
    Ответ написан
    3 комментария
  • Какой самый быстрый способ поиска по массиву объектов?

    Если в проекте используется jQuery то, думаю, есть смысл обратиться к jQuery.grep:
    var source = [{
        id:123,
        name: 'Name1'
      },{
        id: 321,
        name: 'Name2'
      }];
    
    function getObject(source, id) {
    	return jQuery.grep(source, function(e){ return e.id == id; });
    }
    
    console.log(getObject(source, 321));


    Если массив не очень большой, то простого перебора возможно будет вполне достаточно:
    function getObject(source, id) {
      for (var i = 0, len = source.length; i < len; i++) {
        if (source[i].id == id) {
          return source[i];
        }
      }
    }

    Если есть возможность использовать ECMAScript 6, то можно обратиться к его нативной функции (для "старых" браузеров можно подключить этот полифил):
    function getObject(source, id) {
      return source.find(function (el) {
        return el.id === id;
      });
    }

    Или прибегнуть к хорошо поддерживаемому методу filter:
    function getObject(source, id) {
      return source.filter(function(el) {
        return el.id === id;
      })[0];
    }


    Какой из методов покажет покажет себя лучше у вас - тот и используйте. Для тестов просто прогоните каждый, например, так:
    console.time('test_func_exec');
    for (var i = 0; i < 10000000; i++) {
      getObject(source, 123);
    }
    console.timeEnd('test_func_exec');

    Запустив каждый с десяток раз на "боевых" данных, и взяв среднее время выполнения каждого (тестирование, как я полагаю, вы будете производить в браузере).
    Хорошего вам дня!
    Ответ написан
    Комментировать
  • Как правильно передать query SQL из jQuery в PHP?

    Нельзя так делать! SQL-injection - это, конечно, всё выдумки и враки, да-да.

    Сделайте публичный API, который принимая необходимые параметры, после их последующей фильтрации, после их проверки на валидность будет собирать и выполнять SQL запрос, отдавая ответ в json-формате, который клиент без проблем поймет и разберёт.
    Ответ написан
    Комментировать
  • DataPicker, не могу правильно подвесить, где ошибка?

    Если бы you задавали questions в more читабельном format, то it will be проще understand и respectively отвечать. Hope на yours понимание.
    Ответ написан