[英]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.