我正在尝试创建一个对象数组,其中每个对象的属性之一是同一数组中的一些其他对象的列表。与层次结构相似,每个对象都有父对象和子对象。我想知道什么是最有效的方法。我首先想到的是简单地创建唯一ID的数组。所以:
var network = [
{
"id": "ABCD",
"description": "some info",
"parents": [""], //no parents
"childern": ["EFG"]
},
{
"id": "EFG",
"description": "more info",
"parents": ["ABCD"],
"children": ["XYZ"]
},
{
"id": "LMNOP",
"description": "something",
"parents": ["ABCD"],
"children": ["XYZ"]
},
{
"id": "XYZ",
"description": "something",
"parents": ["EFG", "LMNOP"],
"children": [] //no child nodes
}
我对这种方法的担心是,每当我想对“父母”或“孩子”采取行动时,我只有一个名字字符串。我需要搜索数组以将字符串匹配到具有该ID的任何对象。因此,尽管我可以使用network[2].description
获得当前对象的描述,但是我无法做类似network[2].children[0].description
的事情。如果数组包含数百个甚至数千个对象,而我一直在搜索它,那我担心性能。
我考虑的第二种方法是存储父节点和子节点的索引,而不是它们的唯一ID。然后,我可以使用诸如network[network[1].children[0]]
之类的东西来访问父节点或子节点。但是在这种情况下,我依靠对象的顺序来保持静态。我计划在每个用户会话开始时从noSQL数据库中提取数据,所以我认为我不能依靠顺序保持不变。
还有另一种方法吗?当我想到C ++时,我也许可以存储一个指针,但是我不认为我可以在JS中做到这一点。
答案 0 :(得分:1)
我建议您将对象存储在 object 中,而不是数组中。然后,您可以使用id
作为键(也就是指针)来查找对象:
var network = {
"ABCD": {
"id": "ABCD",
"description": "some info",
"parents": [""], //no parents
"children": ["EFG"]
},
"EFG": {
"id": "EFG",
"description": "more info",
"parents": ["ABCD"],
"children": ["XYZ"]
},
"LMNOP": {
"id": "LMNOP",
"description": "something",
"parents": ["ABCD"],
"children": ["XYZ"]
},
"XYZ": {
"id": "XYZ",
"description": "something",
"parents": ["EFG", "LMNOP"],
"children": [] //no child nodes
}
}
// access a parent like this
let parent0 = network["XYZ"]["parents"][0];
console.log(parent0);
// get an array of your node IDs like this
let nodeIds = Object.keys(network);
console.log(nodeIds);
// can still look up by position then
console.log(network[nodeIds[0]]);
答案 1 :(得分:0)
您当然可以使用对对象的引用来实现
github "Moya/Moya"
github "rs/SDWebImage"
binary "https://dl.google.com/dl/firebase/ios/carthage/FirebaseAdMobBinary.json"
binary "https://dl.google.com/dl/firebase/ios/carthage/FirebaseAnalyticsBinary.json"
github "SVProgressHUD/SVProgressHUD"
github "realm/realm-cocoa"