- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个数组,表示根据以下模型的展平树:
export interface TreeModel {
id: number;
parent: number;
value: string;
children?: Array<TreeModel>;
}
示例数据如下:
[
{ id: 1, parent: 5, value: 'Apple' },
{ id: 2, parent: 7, value: 'Carrot' },
{ id: 3, parent: 10, value: 'Lettuce' },
{ id: 4, parent: 5, value: 'Orange' },
{ id: 5, parent: 0, value: 'Fruit' },
{ id: 6, parent: 0, value: 'Condiments' },
{ id: 7, parent: 0, value: 'Vegetables' },
{ id: 8, parent: 6, value: 'Salt' },
{ id: 9, parent: 6, value: 'Pepper' }
{ id: 10, parent: 7, value: 'Green Vegetables' },
{ id: 11, parent: 0, value: 'Microwave' },
{ id: 12, parent: 0, value: 'Utensils' }
]
数据可以有任意数量的嵌套子项。
我想创建一棵具有类似于以下结构的树:
在此结构中,所有内容均按字母顺序排序,并且具有子节点的节点列在顶部。
使用示例数据,这将提供以下结构:
[
{
"id": 6, "parent": 0, "value": "Condiments", "children": [
{
"id": 9, "parent": 6, "value": "Pepper"
}, {
"id": 8, "parent": 6, "value": "Salt"
}
]
}, {
"id": 5, "parent": 0, "value": "Fruit", "children": [
{
"id": 1, "parent": 5, "value": "Apple"
}, {
"id": 4, "parent": 5, "value": "Orange"
}
]
}, {
"id": 7, "parent": 0, "value": "Vegetables", "children": [
{
"id": 10, "parent": 7, "value": "Green Vegetables", "children": [
{
"id": 3, "parent": 10, "value": "Lettuce"
}
]
},
{
"id": 2, "parent": 7, "value": "Carrot"
}
]
},
{
"id": 11, "parent": 0, "value": "Microwave"
}, {
"id": 12, "parent": 0, "value": "Utensils"
}
]
如何使用 JavaScript/Typescript/RxJS 以最有效的方式实现这一点?
这是我到目前为止所尝试过的,尽管域与我的示例不同:
processSavedTrends(savedTrends) {
const mappedTrends: Array<TreeModel> = this.getMappedTrends(savedTrends);
from(mappedTrends)
.pipe(
groupBy(trend => trend.parent),
mergeMap(trendGroup => trendGroup.pipe(toArray())),
map(parentGroup => parentGroup.sort((firstItem, secondItem) => {
const cleanFirstItem = firstItem.value.trim().toLowerCase();
const cleanSecondItem = secondItem.value.trim().toLowerCase();
if (cleanFirstItem < cleanSecondItem) {
return -1;
} else if (cleanFirstItem > cleanSecondItem) {
return 1;
} else {
return 0;
}
}))
)
.subscribe(trendGroup => {
const trendGroups = [];
trendGroups.push(trendGroup);
this.createTreeFromTrendGroups(trendGroups);
});
}
createTreeFromTrendGroups(trendGroups) {
trendGroups.forEach(group => console.log(group));
}
getMappedTrends(savedTrends: Array<SavedTrendModel>): Array<TreeModel> {
return savedTrends.map((savedTrend: SavedTrendModel) => {
return {
id: savedTrend.objectID,
parent: savedTrend.parentID,
value: savedTrend.name
};
});
}
这提供了一个数组数组,其中嵌套数组按父级分组。
非常感谢您的帮助,谢谢!
最佳答案
这是我所拥有的https://es6console.com/jjs2nq9p/
interface TreeModel {
id: number;
parent: number;
value: string;
children?: Array<TreeModel>;
}
const oData : TreeModel[] = [
{ id: 1, parent: 5, value: 'Apple' },
{ id: 2, parent: 7, value: 'Carrot' },
{ id: 3, parent: 10, value: 'Lettuce' },
{ id: 4, parent: 5, value: 'Orange' },
{ id: 5, parent: 0, value: 'Fruit' },
{ id: 6, parent: 0, value: 'Condiments' },
{ id: 7, parent: 0, value: 'Vegetables' },
{ id: 8, parent: 6, value: 'Salt' },
{ id: 9, parent: 6, value: 'Pepper' },
{ id: 10, parent: 7, value: 'Green Vegetables' }
]
const build = (pid) => {
oData.filter(d => d.parent === pid).forEach(d => {
d.children = oData.filter(c => c.parent === d.id);
build(d.id);
if (d.children.length > 0) {
oData = oData.filter(c => c.parent !== d.id);
d.children.forEach(c => build(c.id));
} else {
delete d.children;
}
});
}
build(0);
console.log(JSON.stringify(oData));
关于JavaScript/ typescript : Created Doubly-Sorted Tree from List,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51414001/
作为作业,我必须用双向链表实现四种排序算法(Insertion、Selection、Shell、Quicksort),但我完全迷路了,因为我在网上找到的所有排序算法的解释都需要使用数组。我试图将此代码
我有这个循环,但它不起作用:-/ for i in *CCDSxBaseCov.bed do SM=`(echo $i | sed 's/.bed//g')`; echo $SM
这是我的双向链表的代码。它工作正常。我需要帮助对这个链表的数据元素进行排序。 #include #include struct Node{ int data; struct Node* next;
题目地址:https://leetcode.com/problems/flatten-a-multilevel-doubly-linked-list/description/ 题目描述: Youa
我有一个数组,表示根据以下模型的展平树: export interface TreeModel { id: number; parent: number; value: string;
需要创建单元测试请帮忙当我创建单元测试时,它显示错误“测试中不允许使用参数” package MergeDoublyLL; import java.util.ArrayList; import jav
我正在尝试在已排序的双向链表中添加几个节点。代码有问题,我无法弄清楚。我创建了两个节点 current 和 prev 这将有助于遍历。 /* Insert Node at the end of a
目前我正在尝试解决使用迭代器时遇到的两个问题。 1当使用类似的东西时 forAllIter(PtrDictionary, phases_, iter) { phaseModel& phase = i
我正在编写一个程序来创建一个双向链表并从中删除某个元素。一切都很好,除了列表仅包含 1 个元素的部分,当我尝试删除它时,程序崩溃了。有什么建议吗? #include #include struct
在Data Structures and Algorithms Made Easy , struct 内存高效内存列表给出如下, struct LinkNode { int data; struc
在多线程 C 程序中,我使用了 GLib (https://developer.gnome.org/glib/2.35/glib-Doubly-Linked-Lists.html#g-list-app
所以,我有 puts "test\\nstring".gsub(/\\n/, "\n") 那行得通。 但是我该如何编写一个语句来将\n、\r 和\t 替换为正确转义的对应项? 最佳答案 你必须使用反向
我知道之前已经有人询问并回答了“反转双向链表”,例如: Reversing a Doubly Linked List但我的问题有点不同。 我可以在网上找到的所有方法都使用“当前节点 (curr)”迭代
更正: 链接 #1 http://play.golang.org/p/CKRNyWYF8X 链接 #2 http://play.golang.org/p/oT2yKzFwep 从第一个链接,我确定 p
我正在搞清楚C 中双链表的实现。我的列表按排序顺序添加。我坚持删除这些值。下面的函数不会从双向链表中删除节点。我认为我的逻辑是正确的,但我正在努力分配节点值。 a表示添加,d表示删除 struct N
题目地址:https://leetcode-cn.com/problems/convert-binary-search-tree-to-sorted-doubly-linked-list/ 题目描述
我的模型设置如下。一切正常,除了允许空白部分记录,即使所有部分和章节字段都是空白的。 class Book < ActiveRecord::Base has_many :parts, invers
我遇到过一个奇怪的情况,学生(我在这方面是一名助教)必须实现他们自己的单向链表 (SLL) 版本,并将其与双链表的 Java 标准库实现进行经验比较链表。 这就是它变得奇怪的地方:我看到多名学生注意到
我遇到过一个奇怪的情况,学生(我在这方面是一名助教)必须实现他们自己的单向链表 (SLL) 版本,并将其与双链表的 Java 标准库实现进行经验比较链表。 这就是它变得奇怪的地方:我看到多名学生注意到
在实现此双向链表数据结构时,我收到 Segmentation failure:11 错误。 我已经以下图的形式发布了我的代码: #include #include struct node { stru
我是一名优秀的程序员,十分优秀!