引用尚未定义的属性

问题描述:

我有一个对象数组。需要检查的对象引用属性。但是,这些属性是可选的,可能无法通过。这会导致错误。引用尚未定义的属性

下面是代码的一个极大的简化版本:

var build = { 
    execute: function (type, data) { 
     switch (type) { 

      case "fullName": 
       return build.fullName(data); 
     } 
    }, 
    fullName: function(data){ 
     return data[0] + data[1] 
    } 
}; 

// assume this is the actual inbound data after parsing 
var sample_event = { 
    customer: { 
     firstName: "bob", 
     lastName: "smith", 
     email: "[email protected]" 
    } 
}; 


function cleanStuff(event) { 

    // potential inbound data 

    var prospects = [ 
     {parent: "customer", type: build.fullName, newField: 'fullName',data: [event.customer.firstName, event.customer.middleName, event.customer.lastName]}, 
     {parent: "customer", type: build.fullName, newField:'fullName', data: [event.idontexist.firstName, event.seller.middleName, event.seller.lastName]} 
    ]; 

    function calc(type, newField, calculationData) { 
     var calculated = calculated || {}; 
     return calculated[newField] = build.execute(type, calculationData); 
    } 

    var filteredList = prospects.filter(function (x) { 
     if (event[x.parent] !== undefined) { 
      return x 
     } 
    }); 

    filteredList.forEach(function (item) { 
     var type = item.type, 
      fieldName = item.fieldName, 
      data = item.data; 

     calc(type, fieldName, data, event); 

    }); 
} 

cleanStuff(sample_event); 

一个人如何去引用不存在的属性?我不想创建空属性,或者将它们设置为null。如果他们没有被发送到应用程序,我想简单地避免擦除它们。

我可以创建元素作为字符串,并在使用时将它们解析回属性路径,但我认为这是一种不好的方法。

我还在考虑使用ES6设置代理服务器,但Chrome浏览器尚未更新最新规范。

我正在使用'前景'数组作为排序查询表,“嘿,如果这个值发送,X做它”。

+0

为什么你引用的值还不存在?对我来说,这听起来像是你设计的一个问题。 –

+0

我得到一个包含一堆可选数据的入站JSON Post。这个“前景”数组列出了可能需要一些归一化/清理的所有值。在其他地方有一个“规范化”方法,它接收入站数据,检查这个“前景”数组,并针对相应的“数据”执行规范化的“类型”。我愿意接受任何关于更好的设计或模式的建议。 – Cyph

+0

那么为什么这段代码试图访问在数据存在之前执行的对象呢?你能告诉你如何进行这种访问以获得[mcve]? –

我发现使用新引入的代理服务器(ES6)在这里运行良好,并允许我设置陷阱来处理这些情况。 JS非常酷,除了可以提供很好的抽象级别。

function Event(event) { 
    var proxy = new Proxy(event, { 

     get: function (target, property) { 
      if (property in target) { 
       return target[property]; 
      } else { 
       return " "; 
      } 
     } 
    }); 

    return proxy; 
} 



var event = new Event(sample_event); 

使用Babel(可能通过Webpack或Browserify)编译ES6代码,问题解决了吗?

也许你可以使用承诺的异步函数承诺数据将最终可用?