[英]JSON nested object versus Javascript array
在我的Web应用程序中,我有一个根据从服务器传递的JSON字符串构建的对象。 典型的JSON字符串可能如下所示:
{
"_id": {
"$binary": "4x3tC1oTBkyvbu43rQj0EQ==",
"$type": "03"
},
"title": "Sony FW31 Lit 973.pdf",
"tags": [
{
"category": "Machine",
"text": "Cold Planers"
},
{
"category": "Attachments",
"text": "Blades"
}
]
}
,
{
"_id": {
"$binary": "s/Svg2CjSUWB1QGJ7e3QeA==",
"$type": "03"
},
"title": "Sony FW31 Lit 974.pdf",
"tags": [
{
"category": "Machine",
"text": "Cold Planers"
},
{
"category": "Attachments",
"text": "Blades"
}
]
},... and lots more items...
JSON字符串中可能有数千个对象。 我可以使用JSON.parse()快乐地解析JSON。 这将创建一个对象,我可以使用以下javascript进行迭代:
var soughtKey='4x3tC1oTBkyvbu43rQj0EQ==';
for (var ii = 0; ii < itemlist.length; ii++) {
var item = itemlist[ii];
if (item._id$binary==soughtKey){
doSomething(item);
}
}
这似乎效率很低。 我宁愿这样做:
doSomething(itemlist[soughtKey]);
但是大概要做到这一点,我需要将我的顶级对象转换成某种可索引的键数组吗? 我假设没有办法使用其ID值来访问特定项列表项?
假设不是,将顶级项目列表对象转换为对象数组的最有效方法是什么,在该对象数组中仍可以通过点符号访问原始项目的所有属性,并且可以通过其ID直接访问任何项目? (我知道每个嵌套项目都会有一个_id,但我不会事先知道结构的其余部分)。 在将JSON对象转换为数组与按原样保留它以及使用效率低下的循环之间是否存在性能折衷?
非常感谢。
为了通过值定位某物,您必须在对象上循环并测试各个键上的值。 无法避免这种情况。
为了构建查找对象,您必须循环遍历整个对象一次,并从第一个对象收集值并将它们存储在第二个对象中。 这是预先准备的工作,但是如果您必须根据要用作键的值重复查找内容,则等于以后节省了费用。
因此,问题是,您执行一次此操作(是在特定的JSON返回之后)还是在页面中重复发生(您使用代码A节中的对象的一部分,然后是代码的另一部分)? B部分中的对象,等等)? 如果是前者,则不值得在整个对象之间循环并创建查找而增加的开销。 如果是后者,那么从长远来看,通过使用适当的密钥创建更轻松的方法来检索所需信息的方法,您可能会从中受益。
创建您的查找对象可能如下所示:
var byIds = {};
for (var ii = 0, l = items.length; ii < l; ++ii) {
var item = items[ii];
byIds[item._id.$binary] = {
'title': item['title'],
'tags': item['tags']
};
}
是的,它是另一个要加载的库,但是通过这种事情,以后可以使您的生活变得很轻松。
var soughtKey = '4x3tC1oTBkyvbu43rQj0EQ==' ;
Enumerable.From(myJsonObject)
.Where('$._id.$binary == "' + soughtKey + '"')
.ForEach(doSomething);
function doSomething(obj) {
// do something with "obj";
}
看到它在此jsFiddle中工作。
要创建一个按ID索引的查找对象,也是一种方法:
var index = Enumerable.From(myJsonObject).ToObject("$._id.$binary", "$");
// later:
doSomething(index[soughtKey]);
尝试类似http://goessner.net/articles/JsonPath/的方法 。 JSON的XPath。
尝试记录每个项目的ID?
var remember = {};
for (var ii = 0; ii < itemlist.length; ii++) {
var item = itemlist[ii];
remember[item._id.$binary] = item;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.