Проверка на наличие переменной
Добрый день. К сожалению не нашел ответ на достаточно простой вопрос, не знаю как сформулировать :).
В общем есть объект с вложенными объектами и массивами, и нам нужно проверить существует ли определенная переменная в нем. Пишу условие function full_null(elem){//Проверка на полный ноль. отстутсвие или несуществование. if (elem=='undefined' || elem==null || elem==""){ return true; }else return false; } if (full_null(this.form.rulers.format[this.name])) this.rulers.format=this.form.rulers.format[this.name]; Тут идет проверка на существование в массиве формат, элемента с ключем this.name Но выдается ошибка TypeError: this.form.rulers.format is undefined т.е. сам массив format не был задан. В результате приходится вначале делать проверку на наличие массива - format, а затем уже проверять на наличие в нем this.name. Можно как-то задать проверку в одну строку без двойных условий и try-catch конструкций? |
Цитата:
alert("a" in {a: 1}) |
Это немного не то, все равно выдаст ошибку. Вариант только такой.
try{ if (!full_null(this.form.rulers.format[this.name])) this.rulers.format=this.form.rulers.format[this.name]; }catch(err){ // console.log(err); } Но опять же это увеличивает размер кода. может покороче есть провека, а то планируется достаточно много подобных операций. |
Цитата:
Цитата:
и используйте строгую проверку. ==/=== |
Цитата:
|
Мы с тобой видимо на разных языках говорим :). Вроде все понятно объяснил, а ты все не в ту степь :)
|
Я так понял тебя смутила функция full_null, давай ее уберем.
Этот код работает. if (typeof this.form.rulers.format !='undefined' ){ if (typeof this.form.rulers.format[this.name] !='undefined'){ this.rulers.format=this.form.rulers.format[this.name]; } } Этот нет. (выдает ошибку) if (typeof this.form.rulers.format[this.name] !='undefined'){ this.rulers.format=this.form.rulers.format[this.name]; } Не работает потому-что this.form.rulers.format = undefined Мне нужно убрать проверки условий..может быть запись obj1.obj2.obj3.obj4 и т.д. мне делать проверки на существование каждого обекта? if (typeof obj1 !='undefined'){ if (typeof obj1.obj2 !='undefined'){ и т.д. } } |
vuler,
Хорошо, сначала, по шагам. Определесь, для начала, что ты на самом деле чекаешь, переменную или ее значение. По вопросу, вроде, переменную, а по коду -- значение. Затем продолжим. |
vuler,
Короче, как я понял по коду, тебе нужны значения ключей. Первая твоя ошибка -- elem=="undefined", пиши, elem===undefined, но при этом ты должен учитывать, что так ты отсутствие элемента не определишь, это вычислиться в true и в случае отсутствия элемента, и в слуачае, если значение элемента undefined. |
Цитата:
Точно также, любой слот может быть выставлен в false, в [], в {} и так далее. Ты точно все еще хоцешь пилить свой код дальше? Ты хоть озвуч цель этой проверки, внятно. |
В общем, если я тебя правильно понял, тебе нужна вот такая вот параша
check=function(object, name){ return name in object&&object[name]!== undefined&&object[name]!=="" } object={real: {}, emptyString: ""} alert([ check(object, "emptyString"), check(object, "undef"), check(object, "real") ] ) |
Слушай я уже до самого простого упростил вопрос
Слушай. Я же уже до простого упростил вопрос, забудь то что выше, если не понятно. Объясни следующее. //Как получается If (typeof obj1 !=’undefined’){ If (typeof obj1.obj2 !=’undefined’){ If (typeof obj1.obj2.obj3 !=’undefined’){ var value= obj1.obj2.obj3[0] } } } //Нужно что-то вроде этого, но без остановки скрипта по ошибкам вроде: //obj1 - undefined //obj1.obj2 - undefinded If (typeof obj1.obj2.obj3 !=’undefined’){ var value= obj1.obj2.obj3[0] } Что касается full_null эта функция пользовательская, мне нужно чтобы значение не было пустым |
вот так попробуй
if(window.obj1&&obj1.obj2&&obj1.obj2.obj3&&obj1.obj2.obj3!==undefined) somecode |
vuler,
А вообще, тебе проще оборачивать в try. Но что-то у тебя явно там не так. В нормальном коде едва ли такое может понадобиться. |
для начала скажите чему равен
console.log(this.form.rulers.format):) я так понял у вас ошибка в "this", попробуйте использувать напрямую нужную вам переменную) |
Цитата:
нет, тут наверное никак, если массива нету выдаст ошибку(так и есть) можно попробывать так function full_null(elem){//Проверка на полный ноль. отстутсвие или несуществование. if (elem=='undefined' || elem==null || elem==""){ return true; }else return false; } if (full_null(this.form.rulers.format) && full_null(this.form.rulers.format[this.name])) this.rulers.format=this.form.rulers.format[this.name]; |
Цитата:
|
Цитата:
В php все проще. if ($rrrr->ssss->form_rulersq['sss']) { echo 'тут'; }else{ echo 'там'; } Например этот код пройдет легко. php плевать на то что объекта rrrr не существует, что в нем не существует объект ssss, что в объекте ssss нет массива form_rulersq и т.д. просто выдаст условие else и продолжит работу. А js начинает проверять существование всей этой цепочки |
Цитата:
undefined.foo любой нормальный язык в этом случае по дефолту отдаст ошибку. Я хз, что там у вас в похапе.за идиотизм, скорей всего просто сахар. |
Цитата:
|
Цитата:
|
итог один - нужно проверять два раза :)
function full_null(elem){//Проверка на полный ноль. отстутсвие или несуществование. if (elem=='undefined' || elem==null || elem==""){ return true; }else return false; } if (*!*full_null(this.form.rulers.format) && full_null(this.form.rulers.format[this.name])*/!*) this.rulers.format=this.form.rulers.format[this.name]; |
vuler,
То есть, ты хочешь сказать, что если я, допустим пишу foo.bar.baz=1 и при этом foo не существует, все эти объекты будут созданы? |
Цитата:
только вот так js не сможет :) if ($rrr->ssss->form_rulersq['sss']) { }else{ $rrr->ssss->form_rulersq['sss']++; var_dump($rrr->ssss->form_rulersq['sss']);//1 } Цитата:
KosBeg - ну только так и остается. Все-таки гибкости JS языку не хватает. |
Цитата:
|
Цитата:
|
Цитата:
if ($jjjd->dfdf->dfsdfs->fdsfdf){ }else{ var_dump($jjjd);//NULL $jjjd->dfdf->dfsdfs->fdsfdf++; var_dump($jjjd);//object(stdClass)#2 (1) { ["dfdf"]=> object(stdClass)#3 (1) { ["dfsdfs"]=> object(stdClass)#4 (1) { ["fdsfdf"]=> int(1) } } } } die(); |
Часовой пояс GMT +3, время: 03:38. |