数据清理 JavaScript 对象

data cleansing javascript objects

本文关键字:对象 JavaScript 数据      更新时间:2023-09-26

我有一个内置的http服务器node.js和'connect'。 Web 服务当前将 JSON 请求解析为对象,执行"stuff",并返回同步响应。 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"}}}

我想清理数据,执行诸如删除多余的空格、规范化邮政缩写(即街道到街等)等任务。

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

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

的情况

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

但我不觉得这是非常干燥的,而且它不是非常"节点"地完成的。

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

提前谢谢。

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

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的代码。

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

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

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;
});

我会有一个从 JSON 文件构建的模型,并根据需要对其进行序列化。这将避免匹配或搜索源中可能存在的属性。一些例子:

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

例如,配备此函数后,您就有了一个"地址"对象的数组,然后转换它们将是:

addresses.map(makeAddress);