假设我们以 JavaScript 对象的形式获取采购订单数据:
{
purchaseOrder: {
orderDate: {
year: 1999,
month: 10,
day: 20
},
shipTo: {
country: "US",
name: "Alice Smith",
street: "123 Maple Street",
city: "Mill Valley",
state: "CA",
zip: 90952
},
billTo: {
name: "Robert Smith",
street: "8 Oak Avenue",
city: "Old Town",
state: "PA",
country: "US",
zip: 95819
}, /* ... */
}
}
如果我们知道送货地址存在,我们可以通过以下表达式访问其邮政编码:data.purchaseorder.shipTo.zip
。
现在,如果我们不确定是否存在送货地址,我们就开始跳过障碍。我们基本上必须在每一步中检查该属性是否存在。
设置值也是同样的事情。如果data
还没有purchaseOrder
,那么我们不能只做data.purchaseOrder.shipTo.zip = '90952'
,可以吗?
但是,如果我们事先知道 purchaseOrder
可能 有一个 shipTo
属性,是否可以以某种方式“模仿”缺失的属性?那么 data.purchaseorder.shipTo.zip
只会返回 undefined
而不是抛出类型错误?
反之亦然,data.purchaseorder.shipTo.zip = '90952'
是否可以只创建中间对象?
我正在考虑使用 getter 和 setter 来完成该任务,但我不确定 data.purchaseOrder
和 data.purchaseOrder.shipTo
是否都是 同时未定义
。
有谁知道更好的方法来解决这个问题吗?
我的目标显然是减少检查中间属性是否存在的开销。
最佳答案
您可以为数据对象创建一个 getter 和 setter,它使用一个字符串来指定属性:
data.get = function(path){
var p = path.split('.');
var o = this;
for (var i = 0; i < p.length; i++) {
if (!o.hasOwnProperty(p[i])) return;
o = o[p[i]];
}
return o;
};
data.set = function(path, value){
var p = path.split('.');
var o = this;
for (var i = 0; i < p.length - 1; i++) {
if (!o.hasOwnProperty(p[i])) {
o[p[i]] = {};
}
o = o[p[i]];
}
o[p[i]] = value;
};
用法:
data.set('purchaseorder.shipTo.zip', 90952);
var zip = data.get('purchaseorder.shipTo.zip');
关于javascript - 如何模仿 JavaScript 对象或数组中缺失的属性或元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28387605/