如果我有对象的引用:
var test = {};
可能(但不是立即)具有嵌套对象,例如:
{level1: {level2: {level3: "level3"}}};
检查深度嵌套对象中是否存在属性的最佳方法是什么?
警报(测试级别1);生成未定义,但警告(test.level1.level2.level3);失败。
我目前正在做这样的事情:
if(test.level1 && test.level1.level2 && test.level1.level2.level3) {
alert(test.level1.level2.level3);
}
但我想知道是否有更好的方法。
我已经使用这个函数来访问深度嵌套对象的财产,它对我来说很有效。。。
这是函数
/**
* get property of object
* @param obj object
* @param path e.g user.name
*/
getProperty(obj, path, defaultValue = '-') {
const value = path.split('.').reduce((o, p) => o && o[p], obj);
return value ? value : defaultValue;
}
这是我访问深度嵌套对象属性的方式
{{ getProperty(object, 'passengerDetails.data.driverInfo.currentVehicle.vehicleType') }}
我认为下面的脚本提供了更可读的表示。
声明函数:
var o = function(obj) { return obj || {};};
然后这样使用:
if (o(o(o(o(test).level1).level2).level3)
{
}
我称之为“悲伤小丑技巧”,因为它使用了符号o(
编辑:
这是TypeScript的版本
它在编译时提供类型检查(如果使用像Visual Studio这样的工具,还提供智能感知)
export function o<T>(someObject: T, defaultValue: T = {} as T) : T {
if (typeof someObject === 'undefined' || someObject === null)
return defaultValue;
else
return someObject;
}
用法相同:
o(o(o(o(test).level1).level2).level3
但这次intelligense奏效了!
此外,您可以设置默认值:
o(o(o(o(o(test).level1).level2).level3, "none")
function getValue(base, strValue) {
if(base == null) return;
let currentKey = base;
const keys = strValue.split(".");
let parts;
for(let i=1; i < keys.length; i++) {
parts = keys[i].split("[");
if(parts == null || parts[0] == null) return;
let idx;
if(parts.length > 1) { // if array
idx = parseInt(parts[1].split("]")[0]);
currentKey = currentKey[parts[0]][idx];
} else {
currentKey = currentKey[parts[0]];
}
if(currentKey == null) return;
}
return currentKey;
}
如果结果在嵌套或值本身的任何地方失败,则调用函数返回undefined
const a = {
b: {
c: [
{
d: 25
}
]
}
}
console.log(getValue(a, 'a.b.c[1].d'))
// output
25