2011-10-06 145 views
2

在我的web应用程序我有一个是从服务器传递JSON字符串构建的对象。典型的JSON字符串可能如下所示:JSON嵌套的对象与Javascript数组

{ 
    "_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值的特定ITEMLIST项目?

假设不是,将顶级itemlist对象转换为对象数组的最有效方法是什么,其中原始项目的所有属性仍可通过点符号访问,并且任何项目都可以通过点符号直接访问它的ID? (我知道每个嵌套的项目将有一个_id,但我不知道该结构的提前休息)。以及是否有JSON对象转换为数组与把它当作-是使用我的低效循环之间的性能权衡?

非常感谢。

回答

4

为了找到由值,你必须遍历对象的东西,在个别按键测试值。没有办法避免这种情况。

为了在整个对象一个时间来建立你有一个查找对象中循环,并从第一对象收集值,并将其存储在第二个对象。这在前期是密集的,但如果必须通过您希望用作密钥的值来重复查找某些东西,那么它将相当于以后的储蓄。

所以问题是,你这样做了一次(你是在一段特定的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'] 
    }; 
} 
+0

我将运行查找了很多,所以价格昂贵的前期任务值得去做。我正在考虑构建第二个对象,以便它包含来自第一个对象的所有嵌套对象,但是数组可以通过_id值(作为关联数组)进行索引。好吧? – Journeyman

+0

@Journeyman - 是的,这听起来是正确的。我发布的演示代码确实如此。之后,您可以执行诸如'byIds [seekingKey]'之类的操作,并返回一个Object,该Object具有该标识的标题和标签。 –

+0

同样值得一提的是,如果你这么倾向,是TaffyDB。它允许你查询JSON集合。这是非常漂亮的国际海事组织。 http://taffydb.com/ –

0

尝试使用它的ID记录每个项目?

var remember = {}; 

for (var ii = 0; ii < itemlist.length; ii++) { 
    var item = itemlist[ii]; 
    remember[item._id.$binary] = item; 
} 
+0

据推测,一旦我建立了它,它将比我原来的代码更快地查找? – Journeyman

+0

如果您需要通过id获得相同的项目两次或更多,这是值得的。 – lostyzd

2

你可以给linq.jsreference)一试,如果你想要的。

是的,这是另一个加载库,但它可以使你的生活很容易,事后这样的事情。

var soughtKey = '4x3tC1oTBkyvbu43rQj0EQ==' ; 

Enumerable.From(myJsonObject) 
      .Where('$._id.$binary == "' + soughtKey + '"') 
      .ForEach(doSomething); 

function doSomething(obj) { 
    // do something with "obj"; 
} 

看到它在this jsFiddle工作。


要创建一个查询对象,通过ID索引,将是一个班轮以及:

var index = Enumerable.From(myJsonObject).ToObject("$._id.$binary", "$"); 

// later: 
doSomething(index[soughtKey]); 
+0

对于linq.js +1。不知道它存在;) –