使用rxjs扁平的对象嵌套阵列
我们的数据结构是一个嵌套的数组,
interface dtModel {
id: number;
permission: number;
childs: dtModel[];
}
const data: dtModel[] = [
{
id: 1,
permission: 2,
childs: [
{
id: 2,
permission: 1,
childs: [
{
id: 3,
permission: 3,
childs: [],
},
],
},
],
},
{
id: 4,
permission: 1,
childs: [
{
id: 5,
permission: 2,
childs: [
{
id: 6,
permission: 3,
childs: [
{
id: 7,
permission: 1,
childs: [],
},
],
},
],
},
],
},
];
我在RXJ的帮助下尝试的对象创建了一个扁平的阵列,但我尚未成功,但
[
{id:1,permission:2},
{id:2,permission:1},
{id:3,permission:3},
{id:4,permission:1},
{id:5,permission:2},
{id:6,permission:3},
{id:7,permission:1}
]
我尝试在“降低”的帮助下做到这一点,但因为我的孩子的属性并不总是拥有与这种方法相同的长度。
of(data)
.pipe(
map((items: dtModel[]) => {
return items.reduce((res, curr) => {
res.push({ id: curr.id, permission: curr.permission });
return res;
}, []);
})
)
.subscribe(console.log);
our data structure is a nested array with objects
interface dtModel {
id: number;
permission: number;
childs: dtModel[];
}
const data: dtModel[] = [
{
id: 1,
permission: 2,
childs: [
{
id: 2,
permission: 1,
childs: [
{
id: 3,
permission: 3,
childs: [],
},
],
},
],
},
{
id: 4,
permission: 1,
childs: [
{
id: 5,
permission: 2,
childs: [
{
id: 6,
permission: 3,
childs: [
{
id: 7,
permission: 1,
childs: [],
},
],
},
],
},
],
},
];
I tried with help of RxJs to create a flattened array like this which is I'm not succeeded yet
[
{id:1,permission:2},
{id:2,permission:1},
{id:3,permission:3},
{id:4,permission:1},
{id:5,permission:2},
{id:6,permission:3},
{id:7,permission:1}
]
I tried to do that with help of 'reduce' but because my childs' property does not always have the same length I couldn't do that with this approach.
of(data)
.pipe(
map((items: dtModel[]) => {
return items.reduce((res, curr) => {
res.push({ id: curr.id, permission: curr.permission });
return res;
}, []);
})
)
.subscribe(console.log);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
需要进行递归
rxjs解决方案
demo: htttps://stackblitz.com /Edit/typescript -dlva1z?file= index.ts
说明:
Expand> Expand
操作员的主要思想 - 它允许我们创建递归。空
data
被分配以保留分析的项目 - 将用于减少操作员 - 对整个数据cont检查
- 解析的元素,将Intial值设置为整个数据need to make recursion
RXJS SOLUTION
demo: https://stackblitz.com/edit/typescript-dlva1z?file=index.ts
Explanation:
expand
operator - it allow us to create recursion.EMPTY
of({data: [],last: false, check: source})
- it is our storedata
is assigned to keep parsed item - that will be used in reduce operator - to concat the whole datalast
allows to control recusrion, we are checking if all items is parsedcheck
- element to parse, intial value set to your entire data简化的
expand
版本,只需要确保发出每个项目并在最后使用map
工作示例进行一些清理:https://codesandbox.io/s/rxjs-playground-forked-vr0l6s?file=/src/index.js
非常好的文章解释了
expand
用法https://ncjamieson.com/understand-expand/A simplified
expand
version, just need to ensure every item is emitted and do some clean up at the end withmap
working example: https://codesandbox.io/s/rxjs-playground-forked-vr0l6s?file=/src/index.js
very good article explains
expand
usage https://ncjamieson.com/understanding-expand/您需要进行树(=您的数据结构)遍历,并且对于每个节点,您必须将
{id://some id,permission://somepermission}
推送到结果数组上。你不需要 rxjs。
You need to do a tree (= your data structure) traversal and for every node you have to push
{id://some id,permission://some permission}
on a result array.You don't need rxjs for that.