【问题标题】:Renaming object keys which are nested重命名嵌套的对象键
【发布时间】:2021-08-24 07:03:35
【问题描述】:

我正在访问如下所示的 JSON。

[
{
    "itemType": "SelectionTitle",
    "_id": "5ada2217c114ca048e1db9b0",
    "created_by": "5ab57289d8d00507b29a3fdd",
    "selectionFile": {
        "item.Type": "SelectionFile",
        "name": "1105F.MID",
        "active": true,
        "isFactory.Default": false,
        "selection.Type": "Music",
        "sfzFile": "",
        "destination": "/data/uploads",
        "encoding": "7bit",
        "fieldname": "file",
        "filename": "782f49a7cd72b865b4e2d286816792e7"
        ...
      }
}, ...

我在将名称中包含. 的对象键重命名为_ 时遇到问题。例如:

item.Typeselection.Typeitem_Typeselection_Type

这是我想要使用的:

var json = jsonFromExampleAbove;
str = JSON.stringify(json);
str = str.selectionFile.replace(/\".\":/g, "\"_\":");
json = JSON.parse(str);
console.log(json);

我收到控制台日志错误。我认为这是因为我试图替换的值是嵌套的,但不确定。我在这里仍然是一个初学者。

谢谢。

【问题讨论】:

  • str.selectionFile. 您将对象转换为 JSON 文本字符串,字符串上没有 selectionFile 属性。此外,您的正则表达式是错误的,它正在搜索您的任何键都没有的 ".":

标签: javascript arrays json object


【解决方案1】:

我很想使用Object.entriesObject.fromEntries 进行一些递归

const input = [
{
    "itemType": "SelectionTitle",
    "_id": "5ada2217c114ca048e1db9b0",
    "created_by": "5ab57289d8d00507b29a3fdd",
    "selectionFile": {
        "item.Type": "SelectionFile",
        "name": "1105F.MID",
        "active": true,
        "isFactory.Default": false,
        "selection.Type": "Music",
        "sfzFile": "",
        "destination": "/data/uploads",
        "encoding": "7bit",
        "fieldname": "file",
        "filename": "782f49a7cd72b865b4e2d286816792e7"
  }
}];

function replaceDots(obj){
  return Object.fromEntries(Object.entries(obj).map( ([key,value]) => {
      const newKey = key.replace(".","_");
      return typeof value == "object"
        ? [newKey, replaceDots(value)]
        : [newKey, value]
  }));
}

const result = input.map(replaceDots);

console.log(result);

【讨论】:

    【解决方案2】:

    当值包含点时,您在字符串化 JSON 上使用 replaceAll 的解决方案可能会导致不必要的问题。

    要重命名对象的嵌套键,您需要递归地遍历对象并在删除旧键的同时分配新键

    // for ES6
    function renameKey(obj) {
        // loop over all keys
        for (let k in obj) {
             // apply recursively if value is an object
             if (typeof obj[k] === "object" && obj[k] !== null)
                 renameKey(obj[k]);
             // only replace keys of type String
             if (typeof k === 'string' || k instanceof String) {
                 const newKey = k.replaceAll(".", "_");
                 // assign {newKey:value} to object and delete old key
                 delete Object.assign(obj, { [newKey]: obj[k] })[k];
             }
        }
        return obj
    }
    

    【讨论】:

      【解决方案3】:

      您可以使用递归方法将输入对象中的键替换为您想要的结果。无需使用 JSON.stringify(),可以简单地遍历对象。

      我们将使用searchValue 指定我们希望搜索的内容并使用newvalue 指定替换,在这种情况下它们将是/./g 和'_'。

      let arr = [
          {
              "itemType": "SelectionTitle",
              "_id": "5ada2217c114ca048e1db9b0",
              "created_by": "5ab57289d8d00507b29a3fdd",
              "selectionFile": {
                  "item.Type": "SelectionFile",
                  "name": "1105F.MID",
                  "active": true,
                  "isFactory.Default": false,
                  "selection.Type": "Music",
                  "sfzFile": "",
                  "destination": "/data/uploads",
                  "encoding": "7bit",
                  "fieldname": "file",
                  "filename": "782f49a7cd72b865b4e2d286816792e7"
                }
          }
      ]
      
      
      function replaceKeys(obj, searchvalue, newvalue, newObj) {
          if (!newObj) newObj = Array.isArray(obj) ? []: {};
          for(let k in obj) {
              let newKey = k.replace(searchvalue, newvalue);
              if (typeof(obj[k]) === 'object') {
                  newObj[newKey] = Array.isArray(obj[k]) ? []: {};
                  replaceKeys(obj[k], searchvalue, newvalue, newObj[newKey])
              } else { 
                  newObj[newKey] = obj[k];
              }
          }
          return newObj;
      }
      
      const result = replaceKeys(arr, /\./g, '_');
      console.log('Result:', result);
          

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-11
        • 2018-05-02
        • 2021-08-16
        • 1970-01-01
        • 2018-10-20
        • 1970-01-01
        • 1970-01-01
        • 2020-10-14
        相关资源
        最近更新 更多