问题标签 [nested-sets]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
4127 浏览

ruby-on-rails - 如何在 RubyOnRails 中使用“充当嵌套集”创建可排序接口

我一直在实现一些不错的交互式界面,可以在我的 m rails 应用程序中为使用acts_as_list. 我有一个排序函数,在每次拖放后使用 sortable_element script.aculo.us 函数调用并设置每条记录的位置。

这是在拖放完成后处理排序的控制器操作示例:

acts_as_nested_set现在我正在尝试对嵌套集 ( )的模型做同样的事情。界面交互类型示例: http: //script.aculo.us/playground/test/functional/sortable_tree_test.html

我被困在如何编写控制器操作以在拖放完成时处理排序。

到目前为止,我已将 :tree=>true 参数添加到可排序的 _element 函数中,该函数似乎发送了一个哈希列表,但似乎我仍然缺少有关整个嵌套顺序的信息......

我确定这之前已经完成并且不想尝试重新发明轮子,但我似乎找不到任何控制器操作的示例 <-> 视图与 js 函数设置来处理可排序 acts_as_nested_set

任何有关在 ruby​​onrails 中创建交互式可排序嵌套集的帮助将不胜感激!

谢谢,

约翰

0 投票
1 回答
7438 浏览

php - 嵌套集、php 数组和转换

我需要将此空间树的嵌套集结构(mysql)转换为 json 1)http://blog.thejit.org/wp-content/jit-1.0a/examples/spacetree.html

我发现这个函数可以从嵌套集创建一个数组:2)http://semlabs.co.uk/journal/converting-nested-set-model-data-in-to-multi-dimensional-arrays-in-php

我还可以使用 PHP 函数 json_encode 将 php 数组转换为 json

我的问题:函数nestify(来自第二个链接)给了我不完全是我需要的。我需要这样的东西:http: //pastebin.com/m68752352

你能帮我改变“嵌套”函数,让它给我正确的数组吗?

再来一次这个函数:

0 投票
1 回答
1884 浏览

ruby-on-rails - 如何使用新树最好地从根元素向下复制/克隆整个嵌套集

我在我的 Rails 应用程序中使用“acts_as_nested_set”。(扩展了很棒的嵌套集插件)。我试图找出最好的方法来编写一个函数/方法来克隆一个元素及其整个嵌套集,以便每个元素都得到一个克隆,但关系结构模仿原始元素,只是使用新元素。

使用嵌套集,您可以获得parent_id, lft, and rgt位置列...而不仅仅是position_id.

我应该从每组的底部(没有孩子的节点)开始,然后通过父母一直克隆到新的根吗?

这似乎是已经完成的事情,或者已经有一种方法可以为嵌套集执行此操作,但我找不到任何可以指导我的东西。

谢谢

0 投票
3 回答
3044 浏览

php - PHP:从嵌套集中对数据进行排序

我们目前正在构建一个网站,其中包含一个包含各种能力的分类 MySQL 表,我们注意到嵌套集模型将为此进行优化。虽然,我们遇到了一个非常严重的问题——嵌套集合模型不允许任何排序,我们确实需要这种可能性。我希望输出数据是array(id, name, depth),因为这个函数支持(虽然没有任何排序):

我从一个函数开始,但不知道如何继续:

任何帮助将不胜感激。我已经用谷歌搜索了从嵌套集中对数据进行排序的不同方法,但没有任何好的结果。

先感谢您。

编辑:现在我用 uasort() 函数尝试了一些感觉是正确的方法,但问题仍然存在。

0 投票
4 回答
1846 浏览

php - PHP:对数组进行排序

我有一个数组,其中包含来自嵌套集模型中的 MySQL 表的数据,我想排序,不仅按字母顺序排序,而且子节点也直接在父节点之后。示例 - 要排序的数组(排序前):

我想要这样的数组(排序后):

如您所见,我希望所有父级为 2 的帖子都紧跟在 id 为 2 的帖子之后,依此类推。

任何帮助将不胜感激。先感谢您。

0 投票
13 回答
22517 浏览

mysql - 在嵌套集中移动节点

我需要一个在嵌套集中移动节点及其所有子节点的 MySQL 查询。我找到了这个网站,但这个功能看起来很不合逻辑——没有嵌套集合模型universeidtreeid在嵌套集合模型中,而且代码本身比感觉需要的要长。我在表中得到的唯一额外列是parent.

我不能只是删除并再次添加节点,因为它会丢失它的 ID。

0 投票
1 回答
394 浏览

sql - SQL查询,以避免在用户折叠部分嵌套集时获取整个嵌套集

我试图通过提供比管理员中的平面列表更友好的东西来将 django-mptt 和 contrib.admin 联系在一起。因为树应该很大(否则我不会使用嵌套集),用户应该能够展开和折叠它的一部分。

当用户展开或折叠或展开一个分支(使用 ajax)时,还会设置一个 cookie,其中包含一个逗号分隔的折叠分支列表。这样,下次这个用户访问我的 django-mptt 驱动模型的管理员时,我可以向他展示他离开它的确切状态的树。现在我想使用这个折叠分支列表来通过只获取树的需要部分来减轻我的数据库的负担。

有没有办法有效地做到这一点?我用谷歌搜索的解决方案是对每个分支进行查询,这样他们就可以避免在分支折叠时进行查询,但这对我来说看起来不是很有效。也许有固定数量的查询是可能的?

0 投票
1 回答
1686 浏览

ruby-on-rails - 验证嵌套集中的节点移动

我正在创建一个 Category 模型并使用awesome_nested_set插件(替代acts_as_nested_set)来处理层次结构。使用awesome_nested_set,创建对象,然后保存,然后放置在集合中。同样lftrgtparent_idareattr_protected所以它们不能被直接写入。

将节点放入我希望能够捕获的集合中时,我遇到了两种情况,以便通知用户(可能还有更多我还没有想到的):

  1. 尝试将节点作为自己的子节点放置 ( self.id == self.parent_id)
  2. 试图将一个节点移动到它自己的后代之下 ( self.descendants.include? self.parent_id == true)

在这两种情况下,移动都会失败,但awesome_nested_set只会引发ActiveRecord::ActiveRecordError异常,并且消息的描述性不如我希望能够给用户的那样。

awesome_nested_set有许多节点移动方法,它们都调用move_to(target, position)(其中position一个是:root、或:child,并且是所有s 的相关节点,但)。该方法会触发回调,但没有提供一种我可以看到的在移动发生之前验证移动的方法。为了验证移动,我需要访问回调未收到的目标和位置。:left:righttargetposition:rootbefore_move

有谁知道验证移动的awesome_nested_set方法(通过一种方法将目标和位置传递给before_move另一种方法的回调),或者另一个可以让我验证的嵌套集插件?我不想分叉或编写自己的插件。

0 投票
4 回答
3766 浏览

php - 使用嵌套集构建动态菜单

我正在尝试在我的 PHP CMS 中构建一个动态菜单;页面/类别使用嵌套集模型进行组织。

全树:

我想将此结果集转换为一个无序列表,它只显示树的一部分。例如:如果我单击 B,我只想显示列表的以下部分:

接下来,如果我单击 B1,我希望显示此列表:

等等

我使用以下 SQL 查询从 (mysql) 数据库中获取所有节点:

我设法在没有递归的情况下创建了完整列表(使用深度列),但我无法像上面显示的那样过滤菜单;我想我需要为每个节点获取父节点的 lft 和 rgt 值,并使用 PHP 过滤掉元素。但是如何在同一个查询中获取这些值?

关于如何实现这一目标还有其他建议吗?

提前致谢!

0 投票
3 回答
4782 浏览

sql - 改进改进的前序树遍历算法的可扩展性

我一直在考虑改进的前序树遍历算法,用于将树存储在平面表中(例如 SQL)。

我不喜欢标准方法的一个属性是,要插入一个节点,您必须(平均)触摸 N/2 个节点(左或右高于插入点的所有节点)。

我见过的实现依赖于顺序编号的值。这样就没有更新的余地了。

这似乎不利于并发和扩展。想象一下,您有一个植根于世界的树,其中包含大型系统中每个帐户的用户组,它非常大,以至于您必须将树的子集存储在不同的服务器上。触摸所有节点的一半以将节点添加到树的底部是不好的。

这是我正在考虑的想法。基本上通过对键空间进行分区并在每个级别进行划分来为插入留出空间。

这是一个 N max = 64 的示例(这通常是数据库的 MAX_INT)

在这里,一个节点被添加到树的左半部分。

插入和删除过程必须扩展该算法,以递归地重新编号到子树的左/右索引。由于查询节点的直接子节点很复杂,我认为将父 ID 也存储在表中是有意义的。然后算法可以选择子树(使用 left > p.left && right < p.right),然后使用 node.id 和 node.parent 遍历列表,细分索引。

这比仅仅增加所有索引为插入腾出空间(或减少删除)更复杂,但它有可能影响更少的节点(仅插入/删除节点的父节点的后代)。

我的问题基本上是:

  1. 这个想法是否已经正式化或实施了?

  2. 这与嵌套间隔相同吗?