Проверьте, существует ли объект-член во вложенном объекте
Существует ли более простой способ, чем использование ___ in object
для проверки существования каждого уровня объекта для проверки существования одного элемента?
Более кратко: как я могу проверить, существует ли someObject.member.member.member.value?
Ответы
Ответ 1
В общем, вы можете использовать if(property in object)
, но это было бы еще громоздким для вложенных членов.
Вы можете написать функцию:
function test(obj, prop) {
var parts = prop.split('.');
for(var i = 0, l = parts.length; i < l; i++) {
var part = parts[i];
if(obj !== null && typeof obj === "object" && part in obj) {
obj = obj[part];
}
else {
return false;
}
}
return true;
}
test(someObject, 'member.member.member.value');
DEMO
Ответ 2
Вы также можете попробовать/уловить TypeError?
try {
console.log(someObject.member.member.member.value);
} catch(e) {
if (e instanceof TypeError) {
console.log("Couldn't access someObject.member.member.member.value");
console.log(someObject);
}
}
Ответ 3
Здесь один из способов: http://jsfiddle.net/9McHq/
var result = ((((someObject || {}).member || {}).member || {}).member || {}).value;
alert( result );
Ответ 4
Отъезд lodash-deeps deepHas
https://github.com/marklagendijk/lodash-deep#_deephascollection-propertypath
И это тоже https://github.com/danielstjules/hoops
Ответ 5
Что-то вроде (предупреждение: непроверенный код впереди)
var testProperty = function(obj, proplist) {
for (var i=0; i < proplist.length; i++) {
if (obj.hasOwnProperty(proplist[i])) {
obj = obj[proplist[i]];
} else {
return false;
}
}
return true;
}
Ответ 6
if (someObject.member && someObject.member.member &&
someObject.member.member.member && someObject.member.member.member.value) ...
или аналогичным образом:
var val = foo.bar && foo.bar.jim && foo.bar.jim.jam && foo.bar.jim.jam.value;
Это не будет работать, если какое-либо конкретное значение будет null
, false
, 0
или ""
(пустая строка), но, возможно, за исключением конечного значения, это кажется вряд ли будет иметь место.
Также обратите внимание, что typeof ____ !== "undefined"
не является правильным тестом, чтобы узнать, обладает ли объект свойством. Вместо этого вы должны использовать ___ in object
, например. if ("member" in someObject)
. Это связано с тем, что вы можете установить свойство в явное значение undefined
, которое отличается от удаления с помощью delete someObject.member
.
Ответ 7
Theres safeRead функция определена здесь, на thecodeabode, которая позволяет safeRead вложенных свойств
то есть.
safeRead(foo, 'bar', 'jim', 'jam');
если какое-либо из свойств имеет значение null или undefined возвращает пустую строку - полезно для форматирования/интерполяции строк
Ответ 8
Если вы можете использовать библиотеку lodash
, она имеет очень элегантное решение, hasIn.
_.hasIn(someObject, 'member.level1.level2.level3');
например,
var obj = {'x': 999, 'a': {'b': {'c': 123, 'd': 234}}}
// => undefined
_.hasIn(obj, 'x')
// => true
_.hasIn(obj, 'a.b.d')
// => true
_.hasIn(obj, 'a.b.e')
// => false