简体   繁体   English

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

[英]How do i store keys while flattening?

I have a nested JSON object which is of the format我有一个嵌套的 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'
  }]
}]

for easier understanding this is an array of objects, in each object, the value of key is again an array of 3 objects, of which first tells the dataType and there is value in the second object, and some other keys in third object.为了更容易理解,这是一个对象数组,在每个 object 中,key 的值也是一个包含 3 个对象的数组,其中第一个告诉数据类型,第二个 object 中有值,第三个 object 中有一些其他键。

If the dataType is Object then the second object which has the key property called value will have again array of objects repeating the procedure.如果 dataType 是 Object,那么第二个 object 具有名为 value 的键属性,将再次具有重复该过程的对象数组。

I am able to flatten and the flattened object is like我能够展平,展平的 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'
  }]
}]

but now firstLevelKey2 property name and secondLevelKey2 name are lost但现在 firstLevelKey2 属性名称和 secondLevelKey2 名称丢失

is there a way to store the names so that while mapping back i can know how to nest them back in the same format how i recieved it?有没有一种方法可以存储名称,以便在映射回来时我可以知道如何以我收到的相同格式将它们嵌套回去? like for example in this format例如这种格式


[{
  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'
  }]
}]

any help would be very appreciated.Thanks!任何帮助将不胜感激。谢谢!

You could use a recursive approach here, creating a flattenWithPath function that takes an array and path as arguments.您可以在此处使用递归方法,创建一个flattenWithPath function,它将数组和路径作为 arguments。

By passing the path for each call we can ensure we can retain the object hierarchy in the key names.通过为每个调用传递路径,我们可以确保我们可以在键名中保留 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; }

Here's another take.这是另一种看法。

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.

相关问题 如何使这个数组展平函数在JavaScript中以递归方式运行? - How do I make this array flattening function behave recursively in JavaScript? 如何在Redux中存储排序后的集合,并通过各种键快速对其进行排序? - How do I store a sorted set in Redux, and quickly sort it by various keys? 如何持久且安全地存储用户第三方 api 密钥? - How do i persistently and securely store a users third party api keys? 如何在 Rxjs 中为 Angular Auth 服务进行展平? - How to do the Flattening in Rxjs for Angular Auth Service? 如何从 object 中的所有键中获取特定值并将其存储在数组中? - How do I get specific value from all keys in an object and store it in an array? 如何重命名 Map 对象中的键,同时保持该值与其他键和值相同? - How do I rename a key in a Map Object, while keeping the value and the other keys and values the same? 如何创建对象的对象键的可变对象键? - How Do I Create Variable Object Keys Of Object Keys Of Objects? 我如何获取while循环以将其结果存储在数组中,并重复10次? - How do I get my while loop to store its result in an array, and repeat 10 times? 如何对数组中的键进行排序 - How do I sort the keys in an array 如何通过模式获取对象键? - How to do I get object keys by a pattern?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM