对象迭代并在nodejs中抛出异常

时间:2017-08-17 04:44:44

标签: node.js

刚开始使用来自Python世界的nodejs。对象迭代看起来不像Python那样直观。我有一个复杂的字典对象,我有两个挑战:

  1. 我想抛出异常并保释,如果在处理中的任何时候我找不到所需的密钥(而不是允许nodejs添加'undefined')。有没有办法在没有ifs的情况下做到这一点。例如

    path = dict.url.path  //if url or path are not present, throw exception
    //more nested dict/array looping
    
  2. 什么是干净嵌套循环的最佳方法?我在字典键上有一堆数组作为值,循环非常深入。 e.g

    dict['values'].forEach(value => {
      value['items'].forEach(item => {
       ...
      });
    }); 
    

2 个答案:

答案 0 :(得分:0)

1

path = dict && dict.url && dict.url.path

它被称为“后卫”。运营商。(AKA'和'运营商)如果其中一个是假值。 path也将是假值,例如undefined或null

  1. 您可以这样使用它。您可以通过一些技巧来减少代码长度,但这会损害可读性。
  2. 如果您担心压痕过深,请记住

    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)