![](/img/trans.png)
[英]How to sort an array with parents and children objects with JavaScript?
[英]Algorithm to sort parents before children
我正在写一个绘图应用程序,其中包含可以有子级的形状。 当我需要重新绘制画布时,我想对要绘制的形状进行排序,以使父母出现在孩子面前。 这样,父形状将不会在子形状的顶部绘制。 这是相关的功能(用JavaScript编写)。 变量以my.
为前缀my.
是实例变量。 my.draw_order
是需要被重新绘制(由下面的代码填充)形状索引的阵列, my.ctx
是其中形状绘制的HTML画布背景下, my.shapes
是形状以任意的顺序阵列, my.update_rects
是一个脏矩形数组,可以选择由非常大的形状用于仅进行部分重绘。
redraw = function () {
var i, shape_count, shape;
shape_count = 0;
for (i = 0; i < my.shapes.length; i++) {
shape = my.shapes[i];
if (shape.visible && shape.dirty) {
my.draw_order[shape_count] = i;
shape_count++;
}
}
my.draw_order.length = shape_count;
// sort shapes to draw so that parents appear before children ???
my.draw_order.sort(shape_sort);
for (i = 0; i < my.draw_order.length; i++) {
shape = my.shapes[my.draw_order[i]];
shape.draw(my.ctx, my.update_rects);
shape.dirty = false;
}
my.update_rects.length = 0;
};
我的问题是:实现代码所引用的shape_sort的最佳方法是什么? 这是一个经常被调用的例程,因此效率可能是一个问题。 每个形状都有一个父属性,该属性包含对其父形状的引用。 欢迎提出更好的设计建议。 按排序顺序维护my.shapes
数组是不受欢迎的选择。
如果您需要比树更复杂的数据结构,则应检查拓扑排序算法。
我会保持形状像一棵树。 创建一个根(代表整个屏幕),并为父母提供指向其孩子的指针。 然后,只需对树进行简单的预遍历即可。
要根据您现有的设计来实现,您无需放弃my.shapes
数组。 只需添加一个my.root
,添加从父母到孩子的指针,然后遍历:
function preorder_draw(root) {
//do stuff with root
draw(root);
for (child in root.children) {
preorder_draw(child);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.