【问题标题】:How do I use JSON Stringify to replace all keys and values?如何使用 JSON Stringify 替换所有键和值?
【发布时间】:2018-04-19 01:50:58
【问题描述】:

我正在研究一种利用 JavaScript 中 JSON.Stringify 中的替换函数参数来更改单词大小写(toUpper /toLower case)的方法,问题是我的 JSON 不是直接键:值,有些值也是键,它们本身也有值,所以我需要遍历所有键和值,检查值是否也是键,并确保我更改了所有键和值的大小写(toUpper 或 toLower)。 我知道 JSON.Stringify(object,ReplacerFunction) 中的替换函数遍历所有键和值并在内部进行修改然后返回键和值,但是尽管我已经阅读了一段时间但我无法应用它,并且我不确定是否应该在替换函数中应用递归或如何应用,任何帮助表示赞赏。

我拥有的代码:

 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
    }));

但是这段代码只大写了非常低级别的值,而不是所有的键/值,原因是因为我只能从替换函数返回一个值,在这种情况下是值。

【问题讨论】:

  • 分享你试过的代码。
  • @jmargolisvt,共享。
  • 令我惊讶的是,有多少人更倾向于对我的合理问题投反对票,而不是说些有用的话。
  • 在 Javascript 中的键不能是对象。对于您添加到对象的任何键k,都会调用k.toString()。使用var key = { toString() { return "test" } }; var obj = { [key]: key }; JSON.stringify(obj) === '{"test":{}}' 进行验证。
  • 我对这部分感到困惑:some values are keys also and they have values themselves, so I need to go through all keys and values。所有 json 键都与某个值相关。 “值”不是“键”。现在该值可能是不同的数据类型(即数组、对象和字符串)。您是否只是想对整个 json 对象进行深度遍历,将字符串类型的任何内容大写?

标签: javascript json node.js recursion


【解决方案1】:

JSON.stringify 中的replacer 函数不允许您替换键,如documented in MDN。它允许您转换值,或完全省略键/值对(通过返回 undefined)。

您最好的选择可能是在对对象进行字符串化之前对其进行转换。 Underscore 或 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"}}

您也可以使用 RegEx 和 replace after 如果您愿意,它会被字符串化。代码当然更短,但可读性可能更差:

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"}}

【讨论】:

  • 这是一个ES6 arrow functions => s 大致相当于function(s) { return s }。它们都是采用单个参数(s)然后返回它(或在我的答案中返回大写)的函数。差异有些技术性,主要是箭头函数没有thisarguments 对象。
猜你喜欢
  • 2021-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-21
  • 1970-01-01
  • 1970-01-01
  • 2021-07-01
相关资源
最近更新 更多