【发布时间】:2021-03-04 09:22:54
【问题描述】:
我要转换如下数据结构:
const data = [
{
regions: ['United States', 'Canada']
},
{
regions: ['United States']
},
{
prop1: {
regions: ['Canada']
}
},
{
prop2: [
{
regions: ['Mexico', 'United States'],
prop3: {
regions: ['Canada']
}
}
]
}
];
进入如下数据结构:
['United States', 'Canada', 'United States', 'Canada', 'Mexico', 'United States', 'Canada']
为了安全起见,我希望通过 ES6 递归地使用 .reduce 和 .map 来执行此操作。
这是我迄今为止尝试过的,但它只有 2 个级别:
export const flattenArray = (arr: Object[], prop: string): any[] =>
arr.reduce(
(a, c) => [
...new Set([
...a,
...c.map(x => x[prop]).reduce((y, z) => [...y, ...z.map(j => j)], []),
]),
],
[]
);
更新:我没有使用@deterjan 和他的解决方案。万一有人需要非.flat 版本,这是他在.reduce 的单一功能中的解决方案
export const flatten = (obj: any, prop: string): any[] => [
...new Set(
Object.keys(obj).reduce((a, c) => {
if (c === prop) {
if (isArray(obj[prop])) {
return [...a, ...obj[c]];
} else {
return [...a, obj[c]];
}
} else if (isArray(obj[c])) {
return [
...a,
...obj[c].reduce((a, c) => [...a, ...flatten(c, prop)], []),
];
} else if (isObject(obj)) {
return [...a, ...flatten(obj[c], prop)];
} else {
return a;
}
}, [])
),
];
console.log(flatten(data, 'regions'));
【问题讨论】:
-
你尝试过什么,你在挣扎什么?
-
@ThomasSablik 我已经将我目前尝试过的内容添加到帖子中。
标签: javascript dictionary ecmascript-6 reduce flatten