引用尚未定义的属性
问题描述:
我有一个对象数组。需要检查的对象引用属性。但是,这些属性是可选的,可能无法通过。这会导致错误。引用尚未定义的属性
下面是代码的一个极大的简化版本:
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做它”。
答
我发现使用新引入的代理服务器(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代码,问题解决了吗?
也许你可以使用承诺的异步函数承诺数据将最终可用?
为什么你引用的值还不存在?对我来说,这听起来像是你设计的一个问题。 –
我得到一个包含一堆可选数据的入站JSON Post。这个“前景”数组列出了可能需要一些归一化/清理的所有值。在其他地方有一个“规范化”方法,它接收入站数据,检查这个“前景”数组,并针对相应的“数据”执行规范化的“类型”。我愿意接受任何关于更好的设计或模式的建议。 – Cyph
那么为什么这段代码试图访问在数据存在之前执行的对象呢?你能告诉你如何进行这种访问以获得[mcve]? –