【问题标题】:Replace names of js object properties with abbreviations in JSON string?用JSON字符串中的缩写替换js对象属性的名称?
【发布时间】:2020-08-23 09:52:04
【问题描述】:

我想将一些非常大且重复的 javascript 对象转换为 JSON 字符串。由于这些对象有很多重复的属性名称,我想要使用预定义的属性名称到缩写的映射来用最终 JSON 字符串中的缩写替换这些属性名称。我想我可以使用 JSON.stringify 提供的替换函数来避免必须先生成 JSON 字符串然后对其进行操作,或者直接操作原始对象的属性名称,但我还没有弄清楚如何。

例如,给定以下属性名称和缩写之间的映射:

var map = {
    prop0: "p0",
    prop1: "p1",
    prop2: "p2"
}

我希望能够转换如下对象:

var obj = {
    prop0: "value0",
    prop1: [
        {prop2: "value2"},
        {prop2: "value3"},
        {prop2: "value4"}
    ]
}

转换成这样的 JSON 字符串:

{"p0":"value0","p1":[{"p2":"value2"},{"p2":"value3"},{"p2":"value4"}]}

又回来了。

【问题讨论】:

    标签: javascript json object


    【解决方案1】:

    压缩 JSON 可能有更好的方法,但 JSON.parse reviverJSON.stringify replacer 可用于修改嵌套值(示例在 IE 中不起作用):

    var obj = { prop0: "value0", prop1: [ { prop2: "value2" }, { prop2: "value3" }, { prop2: "value4" } ] }
    
    var replacer = map => (k, v) => v.constructor !== Object ? v : 
      Object.fromEntries( Object.entries(v).map(([k, v]) => [map[k] || k, v]) )
    
    var json = JSON.stringify(obj, replacer({ prop0: "p0", prop1: "p1", prop2: "p2" }))
    
    var obj2 = JSON.parse(json, replacer({ p0: "prop0", p1: "prop1", p2: "prop2" }))
    
    console.log( json )
    console.log( obj2 )

    【讨论】:

    • 嗯好的,所以如果我理解正确,replacer 函数会返回每个嵌套对象的副本,并替换其属性名称?我想我可能会使用这个,谢谢,虽然我也可能最终会在不编辑原始属性名称条件上妥协。此外,我做了一些测试,在我的特殊情况下,用缩写替换属性名称将我的 JSON 字符串的大小减少了大约 40%,所以这可能是一个很好的第一步!
    • @Eclogite 是的,它创建了对象值的新对象。可以将其转换为 for 循环以提高效率并在 IE 中工作。您可以将键缩短为单个字母或数字以节省更多空间。
    【解决方案2】:

    如果没有更多的嵌套值,你可以尝试这样的事情

    var map = {
      prop0: "p0",
      prop1: "p1",
      prop2: "p2"
    }
    
    var obj = {
      prop0: "value0",
      prop1: [{
          prop2: "value2"
        },
        {
          prop2: "value3"
        },
        {
          prop2: "value4"
        }
      ]
    }
    const newObj = {};
    for (let key in obj) {
      if (Array.isArray(obj[key])) {
        newObj[map[key]] = obj[key].map(x => {
          const arrKey = Object.keys(x)[0];
          return {
            [map[arrKey]]: x[arrKey]
          }
        })
      } else {
        newObj[map[key]] = obj[key]
      }
    }
    console.log(JSON.stringify(newObj))

    【讨论】:

      【解决方案3】:

      你可以使用节点模块Json data mapper

      它为您提供了一种方法来提供自己的架构并将您的数据转换为该格式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-07-04
        • 2022-01-27
        • 2019-12-03
        • 1970-01-01
        • 2020-02-02
        • 2020-04-19
        • 2023-01-27
        相关资源
        最近更新 更多