【问题标题】:n-ary tree in JavaScriptJavaScript 中的 n 叉树
【发布时间】:2012-06-25 18:13:23
【问题描述】:

在 JavaScript 中存储 n-ary 树(例如:目录层次结构)的最佳方式是什么?

我需要对其进行以下操作: 1.添加 2.删除 3 更新

有没有提供此功能的 JavaScript 库?

谢谢, 高拉夫

【问题讨论】:

标签: javascript data-structures


【解决方案1】:

JavaScript 对象基本上是键/值对的映射,这意味着如果我理解正确,您可以直接使用它们。

例如,假设您将单词存储在树中,其中每个级别由单词所在位置的字母作为键:

function storeWord(t, word) {
    var index, ch, entry;

    for (index = 0; index < word.length; ++index) {
        ch = word.charAt(index);
        entry = t[ch];
        if (!entry) {
            t[ch] = entry = {};
        }
        t = entry;
    }
    t.terminal = true;
}

var tree = {};
storeWord(tree, "test");
storeWord(tree, "testing");
// Results in tree looking like this:
// tree = {
//     t: {
//         e: {
//             s: {
//                 t: {
//                     terminal: true,
//                     i: {
//                         n: {
//                             g: {
//                                 terminal: true
//                             }
//                         }
//                     }
//                 }
//             }
//         }
//     }
// }

根据您的需要,您的条目可能比仅仅作为树的下一级更复杂。

上面展示了存储的基础知识,包括“添加”和“更新”。

对于删除操作,同样取决于数据的组织方式,但要删除 objcct 中的属性,您可以使用delete 关键字。最简单的:

var foo = {};   // A blank object
foo.bar = 42;   // Now it has a property called bar
delete foo.bar; // Now it doesn't, we've _removed_ the property entirely

因此,当删除一个单词时,您会发现它是否由树中的终端表示,如果是,则删除终端以及通向它的所有已变为空的节点。

要判断一个节点是否为空,可以使用如下函数:

function emptyNode(node) {
    var name;
    for (name in node) {
        if (node.hasOwnProperty(name)) { // This is optional if you're using raw objects
            return false; // Not empty
        }
    }
    return true; // Empty
}

使用上面的,你可以构建一个deleteWord函数。

【讨论】:

  • 我可以想到 2 个可能的原因,尽管在我看来这两个似乎都不公平。 1. 尽管您与 Eswar 进行了讨论 :) 2. 您的回答仅简要介绍了如何将对象用作树结构。您可能希望将其扩展一点,至少包括删除。
  • @ChaosPandion:哦,好意思,我没有直接解决OP的三个操作。
【解决方案2】:

最好的方法是使用 Json(JavaScript Object Notation) 将数据存储在目录层次结构中。使用 JsonEditor 类进行 CRUD 操作。

结帐:http://www.thomasfrank.se/json_editor.html

【讨论】:

  • 它们不是 JSON 对象。它们只是对象。 JSON 是一种文本数据交换表示法。
  • 编辑仍在谈论 JSON。 JSON 与它完全无关,除了作为最终结果的一种可能的序列化格式(其中之一)。
  • " JSON 与它完全无关" .. 这是什么?题?我不再编辑,因为 - JS 对象是 OP 的解决方案,我认为 Json 可以很好地表示树层次结构。
  • 您正在考虑 JavaScript object initializersJSON 完全是另外一回事(特别是:为快速解析、数据交换而优化的初始化语法子集)。
  • 我不会大谈特谈,但重点是 在内存中,当您在代码中与它交互时(这正是 OP 似乎想要的),您根本没有使用 JSON。您正在使用对象。您可以用 JSON、XML 或纯文本序列化它们,或者(经常,但不是在我怀疑的 OP 的情况下)根本不序列化。这是配置文件和配置设置的内存副本之间的区别。这是磁盘上的 Word 文件(可能是 RTF、DOC、DOCX 等)与 Word 在打开以进行编辑时与之交互的内容之间的区别。 :-)
猜你喜欢
  • 2010-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-03
  • 1970-01-01
相关资源
最近更新 更多