【问题标题】:How can I replace spaces in a JSON object keys dynamically using Javascript?如何使用 Javascript 动态替换 JSON 对象键中的空格?
【发布时间】:2015-10-30 14:54:46
【问题描述】:

如何动态地替换 JSON 对象的键中的空格?例如,如果我有以下对象:

[{
    "FIRST NAME": "Philip",
    "LAST NAME": "Rivers",
    "NUMBER": "17",
    "GPA": "1.0",
    "OLD_FACTOR": "8",
    "NICENESS": "1"
}, {
    "FIRST NAME": "Peyton",
    "LAST NAME": "Manning",
    "NUMBER": "18",
    "GPA": "4.0",
    "OLD_FACTOR": "5000",
    "NICENESS": "5000"
}]

我希望能够将“FIRST NAME”和“LAST NAME”分别动态重命名为“FIRST_NAME”和“LAST_NAME”。根据目前的研究,我有这个功能:

function replaceSpaces(data) {
    debugger;
    for (var i = 0; i < data.length; i++) {
        var obj = data[i];
        for (var key in obj) {
            var replacedKey = key.split(' ').join('_');
            data[i][obj] = replacedKey;
        }
    }

    return data;
}

传入的“数据”参数是一个在进入此函数之前已经运行过 JSON.parse 的对象。

我对这段代码的问题是它可以很好地循环键,并将正确的替换字符串分配给“replacedKey”,但它没有将它分配给原始数据对象。

【问题讨论】:

  • data[i][replacedKey] = data[i][key];
  • 您实际上是在询问 JSON 吗?也就是说,您是对转换 JSON 文档/字符串的文本内容感兴趣,还是仅仅对使用 JavaScript 对象感兴趣?
  • 我有兴趣修改 JavaScript 对象的键名(如果我理解正确的话)。我已经将其解析为对象,因此我对更改之前的字符串不感兴趣。

标签: javascript json


【解决方案1】:

这是使用forEach的完整代码。

步骤与Quentin在他的answer中所说的相同

  1. 复制值
  2. 从对象中移除键值对
  3. 在对象中添加具有新值的新项

var arr = [{
  "FIRST NAME": "Philip",
  "LAST NAME": "Rivers",
  "NUMBER": "17",
  "GPA": "1.0",
  "OLD_FACTOR": "8",
  "NICENESS": "1"
}, {
  "FIRST NAME": "Peyton",
  "LAST NAME": "Manning",
  "NUMBER": "18",
  "GPA": "4.0",
  "OLD_FACTOR": "5000",
  "NICENESS": "5000"
}];


// Iterate over array
arr.forEach(function(e, i) {
  // Iterate over the keys of object
  Object.keys(e).forEach(function(key) {
    
    // Copy the value
    var val = e[key],
      newKey = key.replace(/\s+/g, '_');
    
    // Remove key-value from object
    delete arr[i][key];

    // Add value with new key
    arr[i][newKey] = val;
  });
});

console.log(arr);
document.getElementById('result').innerHTML = JSON.stringify(arr, 0, 4);
&lt;pre id="result"&gt;&lt;/pre&gt;

严格来说,如果 JSON 是以字符串的形式从服务器获取的:

_ 替换键中的空格。

JSON.parse(jsonString.replace(/"([\w\s]+)":/g, function (m) {
    return m.replace(/\s+/g, '_');
}));

【讨论】:

  • 好的,我想我现在了解你们了。一秒钟,我会试着把它融入我的。 (由于性能问题,我试图避免使用 .forEach 函数)。
  • @xboxremote 避免forEach?您应该避免使用for...in 以获得更好的性能
  • 我的同事提到他发现一些文章说 .forEach 执行速度较慢。但是,在我自己研究时,由于测试混乱,这看起来确实可能是错误的。无论如何,这非常有效(我最终使用了 .forEach)。谢谢!
  • @DownVoter,至少考虑在否决工作接受答案时添加评论。我很乐意改进答案。
  • @Tushar,严格来说是关于对象 - 使用新键创建新对象会快得多,而不是添加新键并从原始对象中删除旧键。
【解决方案2】:

你需要:

  • 复制
  • 删除旧属性
  • 修改正确的对象。 (data[i][obj] 会将obj 转换为字符串并尝试将其用作属性名称)。

这样的:

    for (var original_property in obj) {
        var new_property = original_property.split(' ').join('_');
        obj[new_property] = obj[original_property];
        delete obj[original_property]
    }

【讨论】:

  • 这里的小错误:key.split 应该是 original_property.split。
【解决方案3】:

因为它是JSON,所以它应该以字符串形式出现,您可以在Regex 的帮助下完成。

var processedJson = yourJson.replace(/( +)(?=[(\w* *]*":)/g, "_");
var yourObj = JSON.parse(processedJson);

/( +)(?=[(\w* *]*":)/g 将在 " ... ": 中找到所有出现的 ,这是每个 JSON 对象的键。

【讨论】:

  • 你能在对象上使用.replace吗?
  • 对,我想 Tushar 就在这里。在解析 JSON 之前,我可以在我的逻辑中更早地执行此操作,但在我的应用程序的上下文中它没有意义。在应用程序的这一点上,我不相信这会起作用。
  • 正则表达式仅适用于字符串。但正如我所说,JSON 以字符串形式出现。或者您可以随时在 JS 中的每个对象上使用 JSON.stringify()
  • @Tushar 当您的 JSON 以字符串形式(来自 ajax)时,使用 Regex 是一种有效的方法,我看不出有任何理由避免它。
  • 我最初的问题可能不清楚,但我希望避免对字符串等价物进行任何操作,因为我已经在我的应用程序逻辑中超越了这一点。此函数旨在获取一个对象,而不是一个字符串。如果我已经有一个可以循环的对象,则不需要再次进行字符串化和解析。不过我绝对理解你的提议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-14
  • 1970-01-01
  • 2017-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多