繁体   English   中英

我如何在展平时存储密钥?

[英]How do i store keys while flattening?

我有一个嵌套的 JSON object 格式

[{
  firstLevelKey1 : [{
    dataType : 'String'
  },{
    value : 'someString'
  },{
    someKey : 'someValue'
  }]
},{
  firstLevelKey2:[{
    dataType : 'Object'
  },{
    value : [{
      secondLevelKey1 :[{
        dataType : 'String'
      },{
        value : 'someString'
      },{
        someKey : 'someValue'
      }]
    },{
      secondLevelKey2 : [{
        dataType : 'Object'
      },{
        value : [{
          thirdLevelKey1:[{
            dataType : 'String'
          },{
            value : 'someString'
          },{
            someKey : 'someValue'
          }]
        },{
          thirdLevelKey2 : [{
            dataType : 'String'
          },{
            value : 'someString'
          },{
            someKey : 'someValue'
          }]
        },{
          thirdLevelKey3 : [{
            dataType : 'String'
          },{
            value : 'someString'
          },{
            someKey : 'someValue'
          }]
        }]
      },{
        someKey : 'someValue'
      }]
    },{
      secondLevelKey3 :[{
        dataType : 'String'
      },{
        value : 'someString'
      },{
        someKey : 'someValue'
      }]
    }]
  },{
    someKey : 'someValue'
  }]
},{
  firstLevelKey3 : [{
    dataType : 'String'
  },{
    value : 'someString'
  },{
    someKey : 'someValue'
  }]
}]

为了更容易理解,这是一个对象数组,在每个 object 中,key 的值也是一个包含 3 个对象的数组,其中第一个告诉数据类型,第二个 object 中有值,第三个 object 中有一些其他键。

如果 dataType 是 Object,那么第二个 object 具有名为 value 的键属性,将再次具有重复该过程的对象数组。

我能够展平,展平的 object 就像

[{
  firstLevelKey1 : [{
    dataType : 'String'
  },{
    value : 'someString'
  },{
    someKey : 'someValue'
  }]
},{
  secondLevelKey1 : [{
    dataType : 'String'
  },{
    value : 'someString'
  },{
    someKey : 'someValue'
  }]
},{
  thirdLevelKey1 : [{
    dataType : 'String'
  },{
    value : 'someString'
  },{
    someKey : 'someValue'
  }]
},{
  thirdLevelKey2 : [{
    dataType : 'String'
  },{
    value : 'someString'
  },{
    someKey : 'someValue'
  }]
},{
  thirdLevelKey3 : [{
    dataType : 'String'
  },{
    value : 'someString'
  },{
    someKey : 'someValue'
  }]
},{
  secondLevelKey3 : [{
    dataType : 'String'
  },{
    value : 'someString'
  },{
    someKey : 'someValue'
  }]
},{
  firstLevelKey3 : [{
    dataType : 'String'
  },{
    value : 'someString'
  },{
    someKey : 'someValue'
  }]
}]

但现在 firstLevelKey2 属性名称和 secondLevelKey2 名称丢失

有没有一种方法可以存储名称,以便在映射回来时我可以知道如何以我收到的相同格式将它们嵌套回去? 例如这种格式


[{
  firstLevelKey1 : [{
    dataType : 'String'
  },{
    value : 'someString'
  },{
    someKey : 'someValue'
  }]
},{
  firstLevelKey2#secondLevelKey1 : [{
    dataType : 'String'
  },{
    value : 'someString'
  },{
    someKey : 'someValue'
  }]
},{
  firstLevelKey2#secondLevelKey2#thirdLevelKey1 : [{
    dataType : 'String'
  },{
    value : 'someString'
  },{
    someKey : 'someValue'
  }]
},{
  firstLevelKey2#secondLevelKey2#thirdLevelKey2 : [{
    dataType : 'String'
  },{
    value : 'someString'
  },{
    someKey : 'someValue'
  }]
},{
  firstLevelKey2#secondLevelKey2#thirdLevelKey3 : [{
    dataType : 'String'
  },{
    value : 'someString'
  },{
    someKey : 'someValue'
  }]
},{
  firstLevelKey2#secondLevelKey3 : [{
    dataType : 'String'
  },{
    value : 'someString'
  },{
    someKey : 'someValue'
  }]
},{
  firstLevelKey3 : [{
    dataType : 'String'
  },{
    value : 'someString'
  },{
    someKey : 'someValue'
  }]
}]

任何帮助将不胜感激。谢谢!

您可以在此处使用递归方法,创建一个flattenWithPath function,它将数组和路径作为 arguments。

通过为每个调用传递路径,我们可以确保我们可以在键名中保留 object 层次结构。

 const input = [{ firstLevelKey1: [{ dataType: 'String' },{ value: 'someString' },{ someKey: 'someValue' }] },{ firstLevelKey2:[{ dataType: 'Object' },{ value: [{ secondLevelKey1:[{ dataType: 'String' },{ value: 'someString' },{ someKey: 'someValue' }] },{ secondLevelKey2: [{ dataType: 'Object' },{ value: [{ thirdLevelKey1:[{ dataType: 'String' },{ value: 'someString' },{ someKey: 'someValue' }] },{ thirdLevelKey2: [{ dataType: 'String' },{ value: 'someString' },{ someKey: 'someValue' }] },{ thirdLevelKey3: [{ dataType: 'String' },{ value: 'someString' },{ someKey: 'someValue' }] }] },{ someKey: 'someValue' }] },{ secondLevelKey3:[{ dataType: 'String' },{ value: 'someString' },{ someKey: 'someValue' }] }] },{ someKey: 'someValue' }] },{ firstLevelKey3: [{ dataType: 'String' },{ value: 'someString' },{ someKey: 'someValue' }] }] function flattenWithPath(arr, path = []) { let result = []; for (let obj of arr) { const [key, value] = Object.entries(obj)[0]; if (Array.isArray(value[1].value)) { result.push(...flattenWithPath(value[1].value, [...path, key])); } else { result.push({ [[...path, key].join('#')]: value }); } } return result; } console.log(JSON.stringify(flattenWithPath(input), null, 2))
 .as-console-wrapper { max-height: 100%;important; }

这是另一种看法。

const input = [{ firstLevelKey1 : [{ dataType : 'String' },{ value : 'someString' },{ someKey : 'someValue' }] },{ firstLevelKey2:[{ dataType : 'Object' },{ value : [{ secondLevelKey1 :[{ dataType : 'String' },{ value : 'someString' },{ someKey : 'someValue' }] },{ secondLevelKey2 : [{ dataType : 'Object' },{ value : [{ thirdLevelKey1:[{ dataType : 'String' },{ value : 'someString' },{ someKey : 'someValue' }] },{ thirdLevelKey2 : [{ dataType : 'String' },{ value : 'someString' },{ someKey : 'someValue' }] },{ thirdLevelKey3 : [{ dataType : 'String' },{ value : 'someString' },{ someKey : 'someValue' }] }] },{ someKey : 'someValue' }] },{ secondLevelKey3 :[{ dataType : 'String' },{ value : 'someString' },{ someKey : 'someValue' }] }] },{ someKey : 'someValue' }] },{ firstLevelKey3 : [{ dataType : 'String' },{ value : 'someString' },{ someKey : 'someValue' }] }] 

function flatObj(obj, path = []) {
    return Object.entries(obj).flatMap(([k, v]) =>
        v[0].dataType === 'Object' ?
            v[1].value.flatMap(obj => flatObj(obj, [...path, k])) :
            [{[[...path, k].join('#')]: v}]
    );
}

console.log(input.flatMap(obj => flatObj(obj)));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM