Mad*_*d-D 4 javascript arrays javascript-objects data-structures typescript
我遇到了这个问题,我能够编写解决方案,可以处理对象数组(这里没有发布)或一个深层嵌套对象,但是当给定对象具有如下所示的嵌套结构时,我无法解决.我很想知道如何解决这个问题.
const source = {
a: 1,
b: {
c: true,
d: {
e: 'foo'
}
},
f: false,
g: ['red', 'green', 'blue'],
h: [{
i: 2,
j: 3
}]
};
Run Code Online (Sandbox Code Playgroud)
解决方案应该是
const solution = {
'a': 1,
'b.c': true,
'b.d.e': 'foo',
'f': false,
'g.0': 'red',
'g.1': 'green',
'g.2': 'blue',
'h.0.i': 2,
'h.0.j': 3
};
Run Code Online (Sandbox Code Playgroud)
尝试一个深层嵌套对象
let returnObj = {}
let nestetdObject = (source, parentKey) => {
let keys = keyFunction(source);
keys.forEach((key) => {
let values = source[key];
if( typeof values === 'object' && values !== null ) {
parentKey = keys[0]+'.'+keyFunction(values)[0]
nestetdObject(values, parentKey);
}else{
let key = parentKey.length > 0 ? parentKey : keys[0];
returnObj[key] = values;
}
})
return returnObj
};
// Key Extractor
let keyFunction = (obj) =>{
return Object.keys(obj);
}
Run Code Online (Sandbox Code Playgroud)
调用该函数
nestetdObject(source, '')
Run Code Online (Sandbox Code Playgroud)
但是如果对象是这样的话,我的尝试就会失败{ foo: { boo : { doo : 1 } } }
.
你应该能够通过递归相当简单地完成它.它的工作方式是,您只是递归地调用对象子上的解析器,该解析器在向下的前面添加正确的键.例如(虽然没有经过严格测试):
const source = {
a: 1,
b: {
c: true,
d: {
e: 'foo'
}
},
f: false,
g: ['red', 'green', 'blue'],
h: [{
i: 2,
j: 3
}]
}
const flatten = (obj, prefix = '', res = {}) =>
Object.entries(obj).reduce((r, [key, val]) => {
const k = `${prefix}${key}`
if(typeof val === 'object'){
flatten(val, `${k}.`, r)
} else {
res[k] = val
}
return r
}, res)
console.log(flatten(source))
Run Code Online (Sandbox Code Playgroud)