[英]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.