将嵌套对象转换为数组
Transforming nested objects to an array
我有一个包含其他对象的对象,例如:
let foo = {
a: {
b: {},
c: {}
},
d: {
e: {}
}
};
现在我想把它转化成一个对象数组,其中前两层的键组成一个键/值对,比如:
let transformedFoo = [
{ outer: 'a', inner: 'b' },
{ outer: 'a', inner: 'c' },
{ outer: 'd', inner: 'e' }
];
我目前的做法是这样的:
let fooTransformed = [];
Object.keys(foo).forEach(function (outerKey) {
Object.keys(foo[outerKey]).forEach(function (innerKey) {
fooTransformed.push({
outer: outerKey,
inner: innerKey
});
});
});
它有效,但我认为它不是 "nice"(即,有两个嵌套循环不太好)。有没有更好的方法来实现这一点(我可以想象有一个非常优雅的纯功能解决方案,但我想不出任何)?
使用 map 和 reduce:
> Object.keys(foo).map(function(key) {
return Object.keys(foo[key]).map(function(val) {
return {outer: key, inner: val} } )
}).reduce(function(a,b) { return a.concat(b) })
[ { outer: 'a', inner: 'b' },
{ outer: 'a', inner: 'c' },
{ outer: 'd', inner: 'e' } ]
我有一个包含其他对象的对象,例如:
let foo = {
a: {
b: {},
c: {}
},
d: {
e: {}
}
};
现在我想把它转化成一个对象数组,其中前两层的键组成一个键/值对,比如:
let transformedFoo = [
{ outer: 'a', inner: 'b' },
{ outer: 'a', inner: 'c' },
{ outer: 'd', inner: 'e' }
];
我目前的做法是这样的:
let fooTransformed = [];
Object.keys(foo).forEach(function (outerKey) {
Object.keys(foo[outerKey]).forEach(function (innerKey) {
fooTransformed.push({
outer: outerKey,
inner: innerKey
});
});
});
它有效,但我认为它不是 "nice"(即,有两个嵌套循环不太好)。有没有更好的方法来实现这一点(我可以想象有一个非常优雅的纯功能解决方案,但我想不出任何)?
使用 map 和 reduce:
> Object.keys(foo).map(function(key) {
return Object.keys(foo[key]).map(function(val) {
return {outer: key, inner: val} } )
}).reduce(function(a,b) { return a.concat(b) })
[ { outer: 'a', inner: 'b' },
{ outer: 'a', inner: 'c' },
{ outer: 'd', inner: 'e' } ]