【问题标题】:data cleansing javascript objects数据清洗 javascript 对象
【发布时间】:2013-10-24 15:47:38
【问题描述】:

我有一个内置于 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 等包来执行此操作,因为我正在执行的规范化类型不仅包括确保字符串是字符串等。

提前致谢。

【问题讨论】:

  • 您可以使用 JSON.parse 的第二个参数将您的数据恢复为干净的格式。由于该函数涉及每个属性和值,因此无需指定深度路径和循环。您可以使用 switch() 根据值或键有选择地修复数据...
  • @dandavis:他已经解析了 JSON 并且已经有了一个对象。阅读问题。

标签: javascript regex json performance node.js


【解决方案1】:

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

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

【讨论】:

  • 感谢代码示例,它工作得很好。我喜欢这个解决方案,很容易扩展规范化并添加到它。我最终会将其设置为自己的服务/中间件。不过我必须说,我不确定我是否完全理解所有代码。我是 JS 新手,但我会使用 mozilla JS 文档来查看我是否能完成所有工作。
  • 小库或具有这些功能的中间件,将非常有用。如果您为它创建一个 github 存储库,我会很乐意帮助您。请在 github 上通知我 - 相同的个人资料名称。干杯
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

    如果配备了这个功能,那么你就有了一个“地址”对象数组,然后将它们转换为:

    addresses.map(makeAddress);
    

    【讨论】:

      猜你喜欢
      • 2021-02-04
      • 2019-03-15
      • 2021-11-21
      • 2018-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-10
      相关资源
      最近更新 更多