javascript - 如何模仿 JavaScript 对象或数组中缺失的属性或元素?

标签 javascript properties

假设我们以 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.purchaseOrderdata.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');

演示:http://jsfiddle.net/Guffa/b22xfkk3/

关于javascript - 如何模仿 JavaScript 对象或数组中缺失的属性或元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28387605/

相关文章:

javascript - fadeIn、fadeOut jQuery 代码片段

c# - PropertyInfo.GetProperty 在不应返回 null 时返回

c# - 属性与方法

java - 在 Android 中加载属性文件

javascript - 显示 SQLite 表中的总行数

JavaScript - 引导验证器

javascript - 时间线json.html :1 Uncaught SyntaxError: Unexpected token @ in JSON at position 1296

javascript - 为什么 simple_form View 中的复选框在 rails 3.2 中选中或取消选中时总是返回 1?

powershell - 谁见过这个潜在的 powershell 对象属性被视为方法调用陷阱?

java - 从 Play 中生成的 getter 和 setter 中获益!框架