0

我有一个内置于 node.js 和“连接”的 http 服务器。Web 服务当前将 JSON 请求解析为对象,执行“处理”并返回同步响应。JSON 来自电子商务购物车,我最终得到一个看起来像(精简版)的对象:

var myObj = {"request":{"industry":"social","transactionId":"gdfs23s","billing":    {"addressLine1":"911 Fallen  Street","addressLine2":"1 2"},"shipping":{"addressLine1":"1523 Willow Tree LAne","addressLine2":"unit 15"}}}

我想清理数据,执行诸如删除额外空白、规范邮政缩写(即街道到 st)等任务。

我编写了一系列成功实现清理/规范化的正则表达式。

但是,我不确定如何有效地执行此操作并将这些清理过程优雅地应用于 JS /Node.js 中的对象。我将有一些场景,我想用相同的正则表达式模式清理 request.billing.addressLine1、request.shipping.addressLine1

我当然可以这样做: var addressCleaner= new RegExp("( str| street| strt)","g"); myObj.request.billing.addressLine1.replace(addressCleaner, "st"); myObj.request.shipping.addressLine1.replace(addressCleaner, "st");

但我不觉得这很干燥,而且它不是很“节点”地完成。

有什么建议或示例方法吗?我想避免使用 Mongoose 等包来执行此操作,因为我正在做的规范化类型不仅包括确保字符串是字符串等。

提前致谢。

4

3 回答 3

0

我有一个从 JSON 文件构建的模型,并在我认为合适的时候对其进行序列化。这将避免匹配或搜索源中不可能存在的属性。一些例子:

function makeAddress(rawAddress) {
    return { street: rawAddress["str"] || 
                     rawAddress["street"] ||
                     rawAddress["strt"],
             . . . };

配备了这个功能,比如说,你有一个“地址”对象数组,然后转换它们将是:

addresses.map(makeAddress);
于 2013-10-24T17:10:59.597 回答
0

如果您的正则表达式适用于在对象中找到的每个字符串,您可以简单地通过对象递归并将正则表达式应用于每个字符串。

通用对象遍历函数对于这样的事情非常有用:

function object_traverse (name,obj,fn) {
    obj = fn(name,obj);
    if (obj instanceof Array) {
        for (var n=0;n<obj.length;n++) {
            obj[n] = object_traverse(n,obj[n],fn);
        }
    }
    else if (typeof obj != "string" && typeof obj != "number") {
        for (var n in obj) {
            obj[n] = object_traverse(n,obj[n],fn);
        }
    }
    return obj;
}

现在你可以这样做:

myObj = object_traverse('',myObj,function(name,obj){
    if (typeof obj == "string" && name.match(/address/i)) {
        obj = obj.replace(addressCleaner, "st");
    }
    return obj;
});
于 2013-10-24T16:19:21.580 回答
0

因此,我建议对所有规范化器进行哈希处理,并分别拥有一个需要规范化的属性列表。在这里有一些代码的想法:

var Normalizers = {
    // -> function
    trim: function(str) { return str.trim(); },
    // -> array [RegExp, StringToReplace]
    street: [ /(str|street)/g, 'st']

    //...
};

var properties = {
    'request.billing.addressLine1': ['trim', 'street'],
    // ..
};

obj_normalize(myObj, properties, Normalizers);

我的代码obj_normalize/obj_getProprety/obj_setProperty移到了gist

于 2013-10-24T22:14:31.733 回答