Как мне легко получить значение вложенного поля в Javascript без исключений нулевой ссылки? - PullRequest
1 голос
/ 14 марта 2012

Я видел много сообщений об использовании оператора in в Javascript, чтобы проверить, существует ли поле в объекте или в цепочке прототипов объекта, но я не видел ни одного, чтобы перейти вниз другим способом.

Допустим, у меня есть объект:

var obj = {
     myField
}

И myField установлен для другого объекта с различными полями на нем:

obj.myField = {
     mySetting: true
}

Если я хочу сослаться на mySetting, скажем, в операторе if, я должен сделать что-то вроде этого:

if (obj.myField && obj.myField.mySetting && obj.myField.mySetting === true)

Если я использую in, это все равно неуклюже:

if ("myField" in obj && "mySetting" in obj.myField && obj.myField.mySetting === true)

Следующее возвращает false:

if ("mySetting" in obj)

Имеется ли какой-то синтаксис, о котором я не знаю, который может позволить мне написать здесь приличное выражение if, возвращая false, если его не существует, или исключая его, по крайней мере, не выбрасывая исключение. Я использую jQuery, так что решение с этим было бы хорошо.

Ответы [ 3 ]

1 голос
/ 14 марта 2012
var a = { b: { c: { d: 10 } } };
var res = [ 'b', 'c', 'd' ].reduce(function(p, c) {
  return p ? p[c] : p;
}, a);

Вы могли бы улучшить это с помощью некоторого синтаксического сахара, я полагаю:

function nested_get(obj, path) {
  return path.split('.').reduce(function(p,c){return p?p[c]:p;}, obj);
}

var obj = { some: { weird: { nested: 'thing' } } };
alert(nested_get(obj, 'some.weird.nested'));
0 голосов
/ 14 марта 2012

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

var myField = obj.myField;
if (myField.mySetting && myField.mySetting === true) { /* do stuff */ }

Наконец, стоит хотя бы упомянуть метод Object.hasOwnProperty, который вы можете использовать для проверки существования поля. Переписав пример выше:

var myField = obj.myField;
if (myField.hasOwnProperty('mySetting') && myField.mySetting === true) { 
  /* do stuff */ 
}
0 голосов
/ 14 марта 2012

Вы проверяете myfield вместо myField, поэтому вы получаете его как ложное. Помните, что JavaScript чувствителен к регистру.

alert(("myField" in obj && "mySetting" in obj.myField && obj.myField.mySetting === true));

Рабочая демоверсия - http://jsfiddle.net/Yfuvu/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...