我正在寻找一种方法来获取一堆JSON对象并将它们存储在一个数据结构中,该数据结构允许快速查找和快速操作,这可能会改变特定对象的结构中的位置。
示例对象:
{
name: 'Bill',
dob: '2014-05-17T15:31:00Z'
}
根据名称升序和dob降序排序,你将如何存储对象,这样如果我有一个新的对象要插入,我很快就知道在数据结构中放置它的位置,以便对象的位置是按其他对象排序?
在查找方面,我需要能够说,“给我索引12处的对象”并快速拉出它。
我可以修改对象以包含有用的数据,例如将当前索引位置等存储在属性中,例如{_indexData:{someNumber:23,someNeighbour:Object}}虽然我不愿意。
我看过b-tree并认为这可能是答案,但不确定如何使用多个排序参数(名称:升序,dob:降序)实现,除非我实现了两个树?
有没有人有好办法解决这个问题?
答案 0 :(得分:1)
您需要做的第一件事是将所有对象存储在数组中。考虑到你想要“给我索引12处的对象”,那么在查找方面这将是你最好的选择,你可以轻松访问该对象,如data[11]
现在要对它们进行存储和排序,请考虑您拥有以下这些对象的数组:
var data = [{
name: 'Bill',
dob: '2014-05-17T15:31:00Z'
},
{
name: 'John',
dob: '2013-06-17T15:31:00Z'
},
{
name: 'Alex',
dob: '2010-06-17T15:31:00Z'
}];
以下简单功能(取自 here )将帮助您根据其属性对其进行排序:
function sortResults(prop, asc) {
data = data.sort(function(a, b) {
if (asc) return (a[prop] > b[prop]);
else return (b[prop] > a[prop]);
});
}
第一个参数是您要对其进行排序的属性名称,例如'name'和第二个是升序排序的布尔值,如果为false,它将按降序排序。
下一步,您需要调用此函数并提供所需的值:
sortResults('name', true);
和Wola!您的数组现在以w.r.t名称递增排序。现在你可以访问数据[11]之类的对象,就像你希望访问它们一样,它们也被排序。
您可以使用示例 HERE 。如果我错过了什么或者无法正确理解你的问题,请随时解释,我会调整我的解决方案。
编辑:再次回答你的问题,我想我错过了动态添加对象位。使用我的解决方案,每次添加可能变得昂贵的对象时,您都必须调用sortResults
函数。