JavaScript中的高效排序数据结构

时间:2014-10-02 07:53:57

标签: javascript json sorting indexing

我正在寻找一种方法来获取一堆JSON对象并将它们存储在一个数据结构中,该数据结构允许快速查找和快速操作,这可能会改变特定对象的结构中的位置。

示例对象:

{
    name: 'Bill',
    dob: '2014-05-17T15:31:00Z'
}

根据名称升序和dob降序排序,你将如何存储对象,这样如果我有一个新的对象要插入,我很快就知道在数据结构中放置它的位置,以便对象的位置是按其他对象排序?

在查找方面,我需要能够说,“给我索引12处的对象”并快速拉出它。

我可以修改对象以包含有用的数据,例如将当前索引位置等存储在属性中,例如{_indexData:{someNumber:23,someNeighbour:Object}}虽然我不愿意。

我看过b-tree并认为这可能是答案,但不确定如何使用多个排序参数(名称:升序,dob:降序)实现,除非我实现了两个树?

有没有人有好办法解决这个问题?

1 个答案:

答案 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函数。