考虑这个例子:
if(this.plantService.plants[id])
{
if(this.plantService.plants[id].Name)
{
if(this.plantService.plants[id].Name[0])
return this.plantService.plants[id].Name[0].value;
else
return '';
}
else
return '';
}
return '';
我想知道是否有可能简化我在这里做的事情。
我的目标是测试对象链this.plantService.plants[id].Name[0]
的有效性。
但是,如果我只是测试if(this.plantService.plants[id].Name[0]) {...}
异常被抛出。
任何提案? :)
答案 0 :(得分:4)
在检查值和类型后,您可以使用对象减少数组。
function getIn(object, keys, def) {
return keys.reduce(function (o, k) {
return o && typeof o === 'object' && k in o ? o[k] : def;
}, object);
}
var object = { plantService: { plants: [{ Name: [{ value: 42 }] }] } };
console.log(getIn(object, ['plantService', 'plants', 0, 'Name', 0, 'value'], 'default value'));
console.log(getIn(object, ['b', 'c', 'd', 'e'], 'default value'));
答案 1 :(得分:2)
你可以自己编写一个简单的函数,如
function getVal(obj, propQueue, defaultValue) {
for (var prop of propQueue) {
if ((obj = obj[prop]) === undefined) {
break;
}
}
return obj || defaultValue;
}
现在你可以称之为,
var value = getVal(this, ["plantService", "plants", id, "name" 0], "");
console.log(value); //either "" or the real value.
答案 2 :(得分:0)
你可以试试这个:
if(this.plantService.plants[id] && this.plantService.plants[id].Name && this.plantService.plants[id].Name[0]){
return this.plantService.plants[id].Name[0].value;
}else{
return '';
}
或许您的问题是您的模型不完整,您需要确保这一点以防止这些验证并替换为:
return this.plantService.plants[id].Name[0].value;