LINUX.ORG.RU

Создание объектов «на лету».

 


0

1

Товарищи, может есть какой-то способ создавать многоуровневые объекты на лету?
То есть в Perl я просто пишу -

$hash{$k_lvl1}{$k_lvl2}{$k_lvl3}=$val;
и не забочусь о том, были ли к настоящему моменту готовы все уровни.
В js мне приходится делать страшное (в существовании _GLOBALS я уверен):
if (!_GLOBALS.cache) _GLOBALS.cache={templates: {qtypes_general: 1}};
else if (!_GLOBALS.cache.templates) _GLOBALS.cache.templates={qtypes_general: 1};
else if (!_GLOBALS.cache.templates.qtypes_general) _GLOBALS.cache.templates.qtypes_general=1;
А если у меня не три, а десять уровней? Могу я как-то упростить себе жизнь?

★★★★★

myset(v, t, k1, k2, ...) если varargs имеется. Иначе ключи массивом.

arturpub ★★
()

Каноничный путь сделать что-то такое, это взять готовый extend или merge, например из lodash.

zz ★★★★
()

if (!_GLOBALS.cache)

я могу ошибаться, но так делать нельзя.
Там надо что-то типа 'undefined' !== typeof(_Globals.cache)

Bad_ptr ★★★★★
()
Ответ на: комментарий от Bad_ptr

undefined всегда ложный. Для моих целей этого достаточно.

Xellos ★★★★★
() автор топика
Ответ на: комментарий от Xellos

Что такое myset?

это твоя самописная функция, которая устанавливает значение по заданному пути.
'атрибуты' объекта в js — это тоже хэшключи объекта, так что такая функция возможна.
Т.е. вместо object.a можно писать object['а'] в js только надо проверять существует ли object и не является ли он null.

Bad_ptr ★★★★★
()
Последнее исправление: Bad_ptr (всего исправлений: 1)

задавать сразу готовую структуру, прочитать про _.extend/_.defaults, изменить дизайн структуры данных, хранить все значения на одном уровне

trashymichael ★★★
()

Я точно не уверен, но, может быть, тебе будет достаточно такой функции?

Object.prototype.Add = function(pname, pval){
  if (this[pname.toString()] === undefined) {
    this[pname.toString()] = pval;
    return this[pname.toString()];
  }
  else {
    return this;
  }
}
var _GLOBALS = {};
_GLOBALS.Add("cache", {templates: {qtypes_general: 1}}).Add("templates", {qtypes_general: 1}).Add("qtypes_general", 1);
Sauron_AZM
()
Ответ на: комментарий от Xellos

Я плохо знаю яваскрипт, myset это самопал, как уже сказали.

function myset(v, t, k1, k2, ...) {
    if (!k2) {
        t[k1] = v;
    }
    else {
        var t2 = t[k1];
        if (!t2) {
            t2 = { };
            t[k1] = t2;
        }
        myset(v, t2, k2, ...);
    }
}

var t = { };
myset(10, t, "a", "b", "c");

Массивный вариант сам пиши — неохота щас в мануал ходить.

arturpub ★★
()
Ответ на: комментарий от Sauron_AZM

А вот это похоже на правду. _.extend не работает как мне нужно, у него недостаточно искусственного интеллекта.

Xellos ★★★★★
() автор топика
Ответ на: комментарий от arturpub

Сделал так.

Object.prototype.Extend = function(args)
{
    var key=args.shift();
    if (!this[key]) this[key]={};
    if (args.length) this[key].Extend(args);
};

Всем спасибо за наводку. То есть это не общий случай, но для моих целей вполне подходит.

Xellos ★★★★★
() автор топика
Ответ на: комментарий от Xellos

Вот именно потому что 7/10 писаного на dojo не имеет аналогов, и наоборот все что есть на jquery есть и на dojo, я на dojo и ушел. И ни разу не пожалел. Хотя конечно, по началу там несколько солоно приходится, да. Порог вхождения у этого тулкита не самый низкий в этом грешном мире.

Но вы, конечно, можете взять эту функцию (она, по-счастью, довольно самодостаточна) и портировать ее на jquery

k0valenk0_igor ★★★
()
Ответ на: комментарий от k0valenk0_igor

Когда я щупал доджо, он мне показался перегруженным и каким-то... черезчур умным, что ли. Фреймворк в плохом смысле этого слова, вроде Catalyst. Тем более я не буду сейчас всё, что написал на jquery, переписывать на доджо...

Xellos ★★★★★
() автор топика
Ответ на: комментарий от Xellos

Пока вы имеете дело с обычными «ура-мы-сегодня-быстро-и-не-напрягаясь-пишем-на-js» сайтами, вам хватит и jquery.

Но как только дело запахнет сколько-нибудь серьезными веб-приложениями - выбора у вас будет не много: либо добавлять в код кучу плохо согласованных между собой расширений, с дополнительным написанием кучи велосипедов согласующих их, - а это титанический труд, либо брать какой-либо фреймворк по-серьезнее и расширять его стандартными (его) средствами в нужных местах.

И дожо однозначно один самых лучших выборов, поскольку он изначально готов этому. Я думаю вы удивитесь узнав, сколько своего кода вы сможете выбросить, заменив его стандартными библиотеками. Я, например, когда перетаскивал свои «чемоданы» выбросил не менее 70-80% кода за очевидной его ненужностью.

k0valenk0_igor ★★★
()
Ответ на: комментарий от k0valenk0_igor

Может быть. В другой раз я посмотрю в сторону доджо.
Пока что я только три плагина взял со стороны - грид, мультиселект и datetimepicker. С последними двумя проблем нет совершенно, с первым скорее высокий порог вхождения.

Xellos ★★★★★
() автор топика
Ответ на: комментарий от Sauron_AZM

Дурацкий вопрос.

Когда я пишу в тестовом примере, Object.prototype.Add = function(params){...} работает нормально.
Вставил в код - интерпретатор считает что params это функция, видимо та, что я пытаюсь определить. Со вытекающей отсюда кучей ошибок.
Что я делаю не так?

Xellos ★★★★★
() автор топика
Ответ на: комментарий от zz

Банальщина.
var handler=function(arg) {alert(typeof arg);};
Object.prototype.Expand=handler;

Всё это прямо внутри <script></script>

А вот трейс странный. Впечатление, что этот код исполняется (???!!!) при вызове ... при вызове $.ajax(). Причём до вызова ajaxSuccess();

Xellos ★★★★★
() автор топика
Ответ на: комментарий от zz

Не, тут не только jquery. Тут сказано, что расширение Object.prototype запрещается на веки веков. В принципе. Что это ломает всё что можно и ещё чуть-чуть.

Xellos ★★★★★
() автор топика
Ответ на: комментарий от Xellos

Ну, в целом, конечно, smell. Но так чтобы на веки вечные - это врядли. Есть (были) библиотеки у которых расширение протипов встроенных типов было основной фишкой.

zz ★★★★
()
Ответ на: комментарий от zz

Ну вот говорят что это есть Чистое и Незамутнённое Зло.

Xellos ★★★★★
() автор топика
Ответ на: комментарий от Xellos

jquery можно мешать с dojo) dojo отлично подходит для толстенных клиентов, в основном как подсказка «правильной архитектуры». А на jquery придется всё придумывать самостоятельно

в jQuery и Dojo меня смущает то, что они дропнули поддержку старых IE. Dojo работает начиная с 8, jQuery - с 9. Недавно случайно наткнулся на это, пришлось откатить jquery до 1.10. Т.е. оно не «может запустится, может нет», а именно что ошибки.

stevejobs ★★★★☆
()
Последнее исправление: stevejobs (всего исправлений: 2)
Ответ на: комментарий от stevejobs

Ну ещё не хватало мешать jquery и доджо.
jquery 1.10 пока вполне себе поддерживается. А если у тебя есть клиенты на ie8 - они сами виноваты. И ты виноват. Может ты ещё и на perl 5.005 пишешь?

Xellos ★★★★★
() автор топика
Ответ на: комментарий от Xellos

Ну я бы писал свои велосипеды на jquery, ибо уже знаю как и что, но, например, в додже есть есть нормальные гриды, а самостоятельно их велосипедить умаешься

есть клиент (1 шт.) с ноутом на XP SP2 без апдейтов. Т.е. у самих конечных пользователей такого говна нету, а конкретно у заказчика - есть, заказчик не может посмотреть сайт и соответственно жутко бесится

stevejobs ★★★★☆
()
Ответ на: комментарий от stevejobs

в додже есть есть нормальные гриды

Доджевых гридов не видел. У себя сейчас использую jqgrid. Руки не доходят пропатчить его, чтобы он гвоздями размеры не прибивал, бо бесит.

Xellos ★★★★★
() автор топика
Ответ на: комментарий от Xellos

есть кассы в магазинах на Win95 (но это не мои клиенты. а хотелось бы, да. там у них жуткое говно вместо интерфейса работает)

stevejobs ★★★★☆
()
Ответ на: комментарий от Sauron_AZM

И сходит с ума JQuery. А возможно - и кто-то ещё.

Xellos ★★★★★
() автор топика
Ответ на: комментарий от Xellos

Все нормальные люди в for..in делают проверку на hasOwnProperty. Или глючит по-другому, просто перестает работать? Конечно, Рейсиг абсолютный авторитет, но мне хочется понять, в чем проблема. Можешь дать пример кода, который мне все прояснит?

Sauron_AZM
()
Ответ на: комментарий от Sauron_AZM

Да все ок, но нужно при итерирование проверять hasOwnProperty на объекте, что как бы и так хороший тон. Вроде в ES5 думают добавить for own in как раз для этих целей.

zz ★★★★
()
Ответ на: комментарий от Xellos

в гробу я видал джкваери. однажды думал почему сайт тормозит. смотрю адовый алгоритм потребляет целых 2 секунды. профиль включаю - алгоритм 1 милисекунда, 20 x outerHeight(height) - 2 секунды. http://www.asfera.info/files/Fck/file/Politik/ldpr_big_01.jpg

с тех пор включаю джкваери только для ие. для браузеров - zepto.

punya ★★
()
Ответ на: комментарий от stevejobs

http://bugs.jquery.com/ticket/12689

It´s even more slow at 1.9 and 1.10

причем сеттер еще медленнее. у меня вышло по 100 милисекунд в среднем на 1 сеттер

рукожопы именно в джкваери

punya ★★
()
Последнее исправление: punya (всего исправлений: 3)
Ответ на: комментарий от punya

там написано, что ошибка возникла в 1.8, в 1.7 ее не было. И что ошибку поправили в 1.9 вот этим тикетом. Ты мог бы откатиться до 1.7 (или 1.8 той версии, где бага еще нету) и подождать появления 1.9.

ты всегда выбрасываешь технологию при натыкании на баг в ней? Пробовал COBOL? (за столько-то лет поди все баги в нем пофиксили)

stevejobs ★★★★☆
()
Ответ на: комментарий от punya

It´s even more slow at 1.9 and 1.10

писец, извини, не прочитал... Да, как-то всё странно...

stevejobs ★★★★☆
()
Ответ на: комментарий от stevejobs

в джкваери все очень медленное. плюс из-за ие там жэсть творится в имплементации. изначально юзали zepto когда заказчику главное под сафари на маке (кстати чем дальше чем таких заказчиков больше) а щас уже везде тычем. outerHeight был последней каплей :P

punya ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.