Обрезать пробелы в ключе объекта и значении рекурсивно

Как рекурсивно обрезать пробелы в ключах и значениях в объекте JavaScript?

Я столкнулся с одной проблемой, в которой я пытался «очистить» предоставленную пользователем строку JSON и отправить ее в другой код для дальнейшей обработки.

Допустим, у нас есть пользовательская строка JSON, ключ и значение свойства которой имеют тип «строка». Однако в этом случае проблемным является то, что ключи и значения не так чисты, как хотелось бы. Скажите {"key_with_leading_n_trailing_spaces": "my_value_with_leading_spaces"}.

В этом случае это может легко вызвать проблему с вашей блестяще написанной программой JavaScript, пытающейся использовать такие данные (или мы должны назвать это грязными данными?), Потому что когда ваш код пытается получить значение из этого объекта JSON, не только ключ не совпадает, но значение не может быть сопоставлено. Я посмотрел вокруг Google и нашел несколько советов, но нет ни одного лекарства, которое вылечит все это.

Учитывая это 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 шага, потому что я не мог найти лучший выстрел, чтобы справиться со всем этим решением. Если есть проблема в моем коде или что-то лучше, пожалуйста, поделитесь с нами.

Спасибо!

Ответы на вопрос(4)

Ваш ответ на вопрос