【问题标题】:Javascript - Iterate over deep nested object and change certain unknown valuesJavascript - 迭代深层嵌套对象并更改某些未知值
【发布时间】:2016-07-26 18:02:27
【问题描述】:

我有一个未知数量的级别和类型(数组、对象、字符串)的对象,这是一个示例:

var data = {
    ffs: false,
    customer: {
        customer_id: 1544248,
        z_cx_id: '123456',
    },
    selected_items: {
        '3600196': [{
            id: 4122652,
            name: 'Essential Large (up to 8\'x10\')',
            selected: true
        }]
    },
    service_partner: {
        id: 3486,
        name: 'Some String',
        street: '1234 King St.',
    },
    subject: 'Project-2810191 - Orange Juice Stain (Rug)',
    description: 'Product Type: \n\nIssue: (copy/paste service request details here)\n\nAction Required:',
}

我必须使用纯 javascript 遍历每个属性并清理每个具有 ' to have '' 的字符串(用于 PostGres 查询),我使用以下代码对其进行更改:

val = val.replace(/'/g, "''");

我可以遍历对象并用它来显示它们,尽管这可能不是最好的解决方案:

function iterObj(obj) {
  for (var key in obj) {
    console.log(key + ': ' + obj[key]);
    if (obj[key] !== null && typeof obj[key] === "object") {
      // Recurse into children
      iterObj(obj[key]);
    }
  }
}

iterObj(data);

问题是我不知道如何实际执行清理部分并更新原始数据数组,因为这是在循环中。

我发现很多人都在问类似的问题,但在我的情况下无法得到他们的答案。

感谢任何帮助。

【问题讨论】:

  • 你确定你需要这个吗?可能您正在使用的库内置了一些卫生逻辑
  • 那么这个:8\'x10\' 应该变成8\"x10\"吗?
  • 很遗憾。

标签: javascript recursion


【解决方案1】:

您可以检查对象并再次调用递归。

function iter(o) {
    Object.keys(o).forEach(function (k) {
        if (o[k] !== null && typeof o[k] === 'object') {
            iter(o[k]);
            return;
        }
        if (typeof o[k] === 'string') {
            o[k] = o[k].replace(/'/g, "''");
        }
    });
}

var data = { ffs: false, customer: { customer_id: 1544248, z_cx_id: '123456' }, selected_items: { '3600196': [{ id: 4122652, name: 'Essential Large (up to 8\'x10\')', selected: true }] }, service_partner: { id: 3486, name: 'Some String', street: '1234 King St.' }, subject: 'Project-2810191 - Orange Juice Stain (Rug)', description: 'Product Type: \n\nIssue: (copy/paste service request details here)\n\nAction Required:' };

iter(data);
console.log(data);

【讨论】:

    【解决方案2】:

    为什么不将整个对象转换为 JSON,然后将所有 ' 替换为 "?然后,您简化了整个操作,无需进行递归。

    var data = {ffs: false, customer: {customer_id: 1544248, z_cx_id: '123456',}, selected_items: {'3600196': [{id: 4122652, name: 'Essential Large (up to 8\'x10\')', selected: true}]}, service_partner: {id: 3486, name: 'Some String', street: '1234 King St.',}, subject: 'Project-2810191 - Orange Juice Stain (Rug)', description: 'Product Type: \n\nIssue: (copy/paste service request details here)\n\nAction Required:',};
    
    data = JSON.stringify(data);
    // or replace with two ' or whatever else
    data = data.replace(/'/g, '\\"');
    data = JSON.parse(data);
    
    console.log(data);

    【讨论】:

    • 这是一个有趣的模式!只要您确保它不会通过替换破坏 JSON,它就非常简单。
    【解决方案3】:

    尝试使用reviver 方法以避免意外破坏您的 JSON 结构。

    var data = {ffs: false, customer: {customer_id: 1544248, z_cx_id: '123456',}, selected_items: {'3600196': [{id: 4122652, name: 'Essential Large (up to 8\'x10\')', selected: true}]}, service_partner: {id: 3486, name: 'Some String', street: '1234 King St.',}, subject: 'Project-2810191 - Orange Juice Stain (Rug)', description: 'Product Type: \n\nIssue: (copy/paste service request details here)\n\nAction Required:',};
    
    data = JSON.stringify(data);
    data = JSON.parse(data, (key, value) => {
        return typeof value === 'string' ? value.replace(/'/g, '\\"') : value;
    });
    
    console.log(data);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-14
      • 2019-02-26
      • 2018-09-04
      • 1970-01-01
      • 2018-04-13
      • 2019-07-19
      • 1970-01-01
      • 2022-06-15
      相关资源
      最近更新 更多