递归修剪Object键和值中的空格

vic*_*hsu 14 javascript recursion trim object

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

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

假设我们有一个用户提供的JSON字符串,其属性键和值的类型为"string".但是,在这种情况下存在的问题是键和值不如所希望的那样干净.说一个{"key_with_leading_n_trailing_spaces":"my_value_with_leading_spaces"}.

在这种情况下,它很容易导致您出色的JavaScript程序试图利用这些数据(或者我们应该将其称为脏数据?),因为当您的代码试图从这个JSON对象中获取值时,不仅键不匹配,但值也无法匹配.我已经浏览了谷歌,并找到了一些提示,但没有一种治愈方法可以治愈这一切.

鉴于这个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   "}
    }
  ]

};
Run Code Online (Sandbox Code Playgroud)

所以这就是我提出的(在使用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));
Run Code Online (Sandbox Code Playgroud)

请注意:我在1,2步中做到了这一点,因为我无法找到更好的一击来解决所有问题.如果我的代码中有问题或更好,请与我们分享.

谢谢!

epa*_*llo 31

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

JSON.parse(JSON.stringify(badJson).replace(/"\s+|\s+"/g,'"'))
Run Code Online (Sandbox Code Playgroud)

  • 您还可以使用带有 `JSON.stringify` 的替换函数来检查该值是否为字符串,如果是则对其进行修剪。请参阅 [此 CodePen](https://codepen.io/ajmueller/pen/NyXNME)。我确信这可以针对性能进行优化,但它很容易阅读,有些简洁,并且对于合理大小的对象应该表现得很好。 (2认同)

Rob*_*obG 20

您可以使用Object.keys清除属性名称和属性以获取键的数组,然后使用Array.prototype.reduce迭代键并使用修剪的键和值创建新对象.该函数需要递归,以便它还修剪嵌套的对象和数组.

请注意,它只处理普通的数组和对象,如果你想处理其他类型的对象,对reduce的调用需要更复杂来确定对象的类型(例如,一个适当聪明的新obj.constructor版本)).

function trimObj(obj) {
  if (!Array.isArray(obj) && typeof obj != 'object') return obj;
  return Object.keys(obj).reduce(function(acc, key) {
    acc[key.trim()] = typeof obj[key] == 'string'? obj[key].trim() : trimObj(obj[key]);
    return acc;
  }, Array.isArray(obj)? []:{});
}
Run Code Online (Sandbox Code Playgroud)

  • 将第一行更改为`if(obj === null ||!Array.isArray(obj)&& typeof obj!='object')返回obj;`帮助我没有为空对象获取错误 (3认同)

Har*_*Das 5

我使用的最好的解决方案是这个。检查有关替换功能的文档。

function trimObject(obj){
  var trimmed = JSON.stringify(obj, (key, value) => {
    if (typeof value === 'string') {
      return value.trim();
    }
    return value;
  });
  return JSON.parse(trimmed);
}

var obj = {"data": {"address": {"city": "\n \r     New York", "country": "      USA     \n\n\r"}}};
console.log(trimObject(obj));
Run Code Online (Sandbox Code Playgroud)