Node.js 对象迭代和在nodejs中引发异常

Node.js 对象迭代和在nodejs中引发异常,node.js,Node.js,刚从nodejs开始,来自Python世界。对象迭代看起来不像Python中那样直观。我有一个复杂的dictionary对象,它面临两个挑战: 如果在处理过程中的任何时候我没有找到所需的键(而不是允许nodejs添加“undefined”),我想抛出一个异常和bail。有没有一种方法可以做到这一点,而不需要一堆假设。e、 g path = dict.url.path //if url or path are not present, throw exception //more nested

刚从nodejs开始,来自Python世界。对象迭代看起来不像Python中那样直观。我有一个复杂的dictionary对象,它面临两个挑战:

  • 如果在处理过程中的任何时候我没有找到所需的键(而不是允许nodejs添加“undefined”),我想抛出一个异常和bail。有没有一种方法可以做到这一点,而不需要一堆假设。e、 g

    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 => {
       ...
      });
    }); 
    
  • 一,

    如果其中一个是falsy值,则称为“guard”运算符(也称为“and”运算符)。路径也将是错误的值,例如未定义或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);
    }
    

    从你问题的第一部分开始。如果您使用的是node v8+,则可以使用
    Proxy
    来完成此任务

    const strictAccess=obj=>新代理(obj{
    获取(目标、属性){
    如果(!Reflect.has(目标,属性)){
    抛出新错误(`对象没有属性${property}.`)
    }
    const value=Reflect.get(目标,属性)
    返回值的类型=='object'?strictAccess(值):值
    }
    })
    const dict=strictAccess({
    网址:{
    路径:“路径值”
    }
    })
    试一试{
    不动产
    }捕获(e){
    console.log(e.message)
    }
    试一试{
    dict.url.missingProperty
    }捕获(e){
    console.log(e.message)
    }
    
    console.log(dict.url.path)
    最好将其分为两个独立的问题。第一个问题与之相反,“如果在处理过程中的任何时候我没有找到所需的密钥,我想抛出一个异常并退出”没有问题。但是如果
    dict.url
    没有
    path
    w/o ifs,我看不出你的代码会抛出什么。谢谢,这当然有帮助。但是try/catch适用于内部密钥。如果最后一个键未定义(如path),它将通过。@LazyGetter您必须手动处理它。我已经更新了我的answer@ZeroCho你不需要代理。
    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);
    }