gpt4 book ai didi

javascript - 从 MongoDB 在 Node.Js 中创建一个 JSON 树

转载 作者:可可西里 更新时间:2023-11-01 09:36:54 27 4
gpt4 key购买 nike

我花了几天时间尝试从我的 MongoDB 创建一个 JSON 树。我用 child reference model structure ,其中“Books”是根 Node 。
我正在尝试实现这种形式的 JSON 树:

[{
title: "Books",
children: [{
title: "Programming",
children: [{
title: "Databases",
children: [{
title: "MongoDb"
}, {
title: "Postgres"
}]
}, {
title: "Languages"
}]
}, {
title: "Item 2"
}, {
title: "Item 3"
}, {
title: "Item 4"
}]
}]

但我真的很难让它发挥作用。第一级(Books, Item 2/3/4)只能有5个项目,但其他子菜单可以有无限个。

我怎样才能实现对 Mongo 的调用将给这个树结构的数据数组的转换?提前致谢

最佳答案

假设您必须跟踪数据(已从数据库加载):

var data = [
{ _id: "MongoDB", children: [] },
{ _id: "Postgres", children: [] },
{ _id: "Databases", children: [ "MongoDB", "Postgres" ] },
{ _id: "Languages", children: [] },
{ _id: "Programming", children: [ "Databases", "Languages" ] },
{ _id: "Books", children: [ "Programming" ] }
];

因为 _id 是唯一的,所以第一步你把它转换成字典,其中键是 ids:

var dct = {};
for (var i = 0; i < data.length; i++) {
var doc = data[i];
dct[doc._id] = doc;
}

现在你再次遍历 data 数组并设置 child :

for (var i = 0; i < data.length; i++) {
var doc = data[i];
var children = doc.children;
var ref_children = [];
for (var j = 0; j < children.length; j++) {
var child = dct[children[j]]; // <-- here's where you need the dictionary
ref_children.push(child);
}
doc.children = ref_children;
}

瞧,你已经完成了:

JSON.stringify(data);

编辑

如果您只想要根(不是任何其他 Node 的子 Node 的 Node ),那么首先您必须找到它们:

var get_parent = function(node, docs) {
for (var i = 0; i < docs.length; i++) {
var doc = docs[i];
if (doc.children.indexOf(node) != -1) {
return doc;
}
}
return null;
};

var roots = [];
for (var i = 0; i < docs.length; i++) {
var doc = data[i];
if (get_parent(doc, docs) === null) {
roots.push(doc);
}
}
JSON.stringify(roots);

更有效的方法是在取消引用子项时存储父项(与编辑上面的代码相比):

for (var i = 0; i < data.length; i++) {
var doc = data[i];
var children = doc.children;
var ref_children = [];
for (var j = 0; j < children.length; j++) {
var child = dct[children[j]]; // <-- here's where you need the dictionary
child.has_parent = true; // <-- has a parent
ref_children.push(child);
}
doc.children = ref_children;
}

var roots = [];
for (var i = 0; i < data.length; i++) {
var doc = data[i];
if (!doc.has_parent) {
roots.push(doc);
}
}
JSON.stringify(roots);

关于javascript - 从 MongoDB 在 Node.Js 中创建一个 JSON 树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18959582/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com