javascript - 递归地 trim 对象键和值中的空格

标签 javascript object recursion trim

如何递归地 trim JavaScript 对象中键和值中的空格?

我遇到了一个问题,我试图“清理”用户提供的 JSON 字符串并将其发送到我的其他代码中以进行进一步处理。

假设我们有一个用户提供的 JSON 字符串,其属性键和值的类型为“字符串”。但是,在这种情况下,问题在于键和值并不像预期的那样干净。说一个 {“key_with_leading_n_trailing_spaces”:“my_value_with_leading_spaces”}。

在这种情况下,它很容易导致您编写出色的 JavaScript 程序尝试使用此类数据(或者我们应该称之为脏数据?)的问题,因为当您的代码试图从该 JSON 对象中获取值时,不仅key不匹配,value也匹配不上。我环顾了谷歌并找到了一些提示,但没有一种方法可以包治百病。

鉴于此 JSON 在键和值中包含大量空格。

var badJson = {
  "  some-key   ": "    let it go    ",
  "  mypuppy     ": "    donrio   ",
  "   age  ": "   12.3",
  "  children      ": [
    { 
      "   color": " yellow",
      "name    ": "    alice"
    },    { 
      "   color": " silver        ",
      "name    ": "    bruce"
    },    { 
      "   color": " brown       ",
      "     name    ": "    francis"
    },    { 
      "   color": " red",
      "      name    ": "    york"
    },

  ],
  "     house": [
    {
      "   name": "    mylovelyhouse     ",
      " address      " : { "number" : 2343, "road    "  : "   boardway", "city      " : "   Lexiton   "}
    }
  ]

};

这就是我想出的(在使用 lodash.js 的帮助下):

//I made this function to "recursively" hunt down keys that may 
//contain leading and trailing white spaces
function trimKeys(targetObj) {

  _.forEach(targetObj, function(value, key) {

      if(_.isString(key)){
        var newKey = key.trim();
        if (newKey !== key) {
            targetObj[newKey] = value;
            delete targetObj[key];
        }

        if(_.isArray(targetObj[newKey]) || _.isObject(targetObj[newKey])){
            trimKeys(targetObj[newKey]);
        }
      }else{

        if(_.isArray(targetObj[key]) || _.isObject(targetObj[key])){
            trimKeys(targetObj[key]);
        }
      }
   });

}

//I stringify this is just to show it in a bad state
var badJson = JSON.stringify(badJson);

console.log(badJson);

//now it is partially fixed with value of string type trimed
badJson = JSON.parse(badJson,function(key,value){
    if(typeof value === 'string'){
        return value.trim();
    }
    return value;
});

trimKeys(badJson);

console.log(JSON.stringify(badJson));

请注意:我分 1、2 个步骤完成此操作,因为我找不到更好的一次性解决方案。如果我的代码有问题或有任何更好的地方,请与我们分享。

谢谢!

最佳答案

您可以对其进行字符串化、字符串替换和重新解析

JSON.parse(JSON.stringify(badJson).replace(/"\s+|\s+"/g,'"'))

关于javascript - 递归地 trim 对象键和值中的空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33510625/

相关文章:

c - KTouring递归代码

java - 从 IntroSort 转到 MergeSort

javascript - 无法完全显示可编辑的多行字段 - Maximo Anywhere

javascript - 如何仅在 RxJs 中可观察到的源发出的某些错误上重试

javascript - 在点击时显示社交图标的子列表

php - 如何从函数返回对象?

jQuery 帖子对象

java - 在 Object 的 ArrayList 中,如何将 Object 转换为 ArrayList 中包含的类的 3 个实例之一?

javascript - 模型销毁成功回调不起作用

javascript - 改进当前的递归函数?