我想转换以下数据结构:
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'));
小怪兽爱吃肉
慕虎7371278
相关分类