当前位置: 首页 > 知识库问答 >
问题:

如何使用JSON Stringify替换所有键和值?

慕容宇
2023-03-14

我正在研究一种利用JSON中的替换函数参数的方法。Stringify在JavaScript中为了更改单词大小写(toTop /toLowercase),问题是我的JSON不是直键:value,有些值也是键,它们本身也有值,所以我需要遍历所有键和值,检查值是否也是键,并确保我更改所有键和值的大小写(toTop或toDown)。我知道JSON. Stringify(对象,Replace erFunction)中的替换函数遍历所有键和值,并在其中进行修改,然后返回键和值,但尽管我已经阅读了一段时间,但我不能应用它,我不确定是否应该在替换函数中应用递归或如何应用,感谢任何帮助。

我拥有的代码:

 function _replacer(name,val){
   if(typeof val != "object"){
       return val.toString().toUpperCase()
   }
   if(typeof name != "object"){
            return name.toString().toUpperCase()
        }

   console.log("key = "+name+" type: "+typeof  name);
   console.log("value ="+val+" type: "+typeof  val);

    }

也:

 function _replacer(name,val){
   if(typeof val != "object" &&typeof  val ==="string"){
       return val=val.toUpperCase()
   }
   if(typeof name != "object" &&typeof  name ==="string"){
            name=name.toUpperCase()
        }
    return val;
    }

而且,我最终达到了这个阶段:

 var res = JSON.parse(JSON.stringify(j, function(key, value) {
        return typeof value === "string" ? value.toUpperCase() : value
    }));

但这段代码只对非常低级别的值进行大写,而不是所有的键/值,原因是我只能从replacer函数返回一个值,在本例中是值。

共有1个答案

栾弘新
2023-03-14

JSON中的replacer函数。stringify,不允许您替换MDN中记录的密钥。它允许您转换值,或完全省略键/值对(通过返回未定义的)。

最好的办法可能是在串化对象之前对其进行变换。下划线或Lodash将使这变得非常简单,但您可以在本机上完成,而不需要像这样太多麻烦:

const xform = obj => {
  return Object.keys(obj).reduce((xformed, key) => {
    let value = obj[key]

    if (typeof value ==='string') value = value.toUpperCase()
    else if (typeof value === 'object') value = xform(value)

    xformed[key.toUpperCase()] = value
    return xformed
  }, {})
}

console.log(JSON.stringify(xform({a: 'b', c: 1, d: {e: 'f'}})))
// {"A":"B","C":1,"D":{"E":"F"}}

如果您愿意,您还可以使用正则表达式并在字符串化后替换。代码当然更短,但可能更难读:

const stringified = JSON.stringify({a: 'b', c: 1, d: {e: 'f'}})
console.log(stringified.replace(/".+?"/g, s => s.toUpperCase()))
// {"A":"B","C":1,"D":{"E":"F"}}

 类似资料:
  • 我通过一个接一个地放置值来创建HashMap。当我在每次迭代后打印hashmap时,生成的hashmap包含所有键的相同值。我不明白为什么会这样。我已经粘贴了下面的输出 HashMap(String,List(Object))mRestrictions; 输出:- 逐个限制:-{profile\u name=[Test1]} 逐个限制:-{profile\u name=[url],url=[url

  • 问题内容: 我想替换JavaScript字符串中所有出现的dot() 例如,我有: 我想得到:。 到目前为止,我尝试了: 但这最终将所有字符串替换为空格。 问题答案: 您需要对进行转义,因为它在正则表达式中具有“任意字符”的含义。

  • 我正在尝试用大量新值替换所有文档。 例如,我们在数据库中500k文档,并且我们500k了相同的文档,其中包含更新的道具。现在我们需要更新旧数据。 想法是在新集合中使用InsertMany with lean选项,然后删除旧集合以减少读/写次数。 问题是,对于这种情况,有没有更简单的方法? 在这种情况下,也许连进出口都更好? PS模型。updateMany()有一个过滤器,我们这里不需要过滤器,因为

  • 如何替换所有标签

  • 问题内容: 我是否缺少某些东西,或者StringBuilder是否缺少与普通String类相同的“用字符串B替换所有出现的字符串A”功能?StringBuilder的替换功能并不完全相同。有没有什么方法可以更有效地使用普通的String类生成多个String? 问题答案: 好了,你可以编写一个循环: 请注意,在某些情况下,从背面开始使用可能会更快。我怀疑是用短字符串替换长字符串的情况-因此,当你开

  • 问题内容: 我有这个字符串: 正在做: 似乎只删除了上面字符串中的第一个匹配项。 如何替换 所有 出现的内容? 问题答案: 注意:请勿在对性能有要求的代码中使用此代码。 作为简单文字字符串的正则表达式的替代方法,您可以使用 一般模式是 在某些情况下,它过去比使用和正则表达式要快,但是在现代浏览器中,情况似乎不再如此。 结论:如果您有性能至关重要的用例(例如,处理数百个字符串),请使用Regexp方