刚开始使用来自Python世界的nodejs。对象迭代看起来不像Python那样直观。我有一个复杂的字典对象,我有两个挑战:
我想抛出异常并保释,如果在处理中的任何时候我找不到所需的密钥(而不是允许nodejs添加'undefined')。有没有办法在没有ifs的情况下做到这一点。例如
path = dict.url.path //if url or path are not present, throw exception
//more nested dict/array looping
什么是干净嵌套循环的最佳方法?我在字典键上有一堆数组作为值,循环非常深入。 e.g
dict['values'].forEach(value => {
value['items'].forEach(item => {
...
});
});
答案 0 :(得分:0)
1
path = dict && dict.url && dict.url.path
它被称为“后卫”。运营商。(AKA'和'运营商)如果其中一个是假值。 path也将是假值,例如undefined或null
如果您担心压痕过深,请记住
value => {
value['items'].forEach(item => {
...
});
}
上面的是一个函数,你可以把它变成一个变量。
编辑:如果你想抛出问题1的例外
try {
path = dict.url.path;
if (!path) {
throw new Error('no path');
}
// some other codes
} catch (err) {
console.error('dict or url is undefined!', err);
}
答案 1 :(得分:0)
截至问题的第一部分。如果您使用的是节点v8 +,则可以使用Proxy
来完成此操作
const strictAccess = obj => new Proxy(obj, {
get(target, property) {
if (!Reflect.has(target, property)) {
throw new Error(`Object doesn't have property ${property}.`)
}
const value = Reflect.get(target, property)
return typeof value === 'object' ? strictAccess(value) : value
}
})
const dict = strictAccess({
url: {
path: 'path value'
}
})
try {
dict.missingProperty
} catch (e) {
console.log(e.message)
}
try {
dict.url.missingProperty
} catch (e) {
console.log(e.message)
}
console.log(dict.url.path)