JavaScript中高效的排序数据结构

Efficient Sorted Data Structure in JavaScript

本文关键字:排序 数据结构 高效 JavaScript      更新时间:2023-09-26

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

示例对象:

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

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

在查找方面,我需要能够说,"把索引12处的对象给我",它会很快把它拉出来。

我可以修改对象以包括有用的数据,例如在属性中存储当前索引位置等,例如{_indexData:{someNumber:23,someNeighbour:Object}},尽管我不希望这样做。

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

有人有解决这个问题的好方法吗?

首先需要做的是将所有对象存储在一个数组中。考虑到你想"给我索引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'
}];

以下简单函数(取自此处)将帮助您根据它们的属性对它们进行排序:

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);

和沃拉!您的数组现在按名称升序排列。现在,您可以访问像data[11]这样的对象,就像您希望访问它们一样,它们也会被排序。

您可以在此处使用示例。如果我遗漏了什么或不能正确理解你的问题,请随时解释,我会调整我的解决方案。

编辑:再看一遍你的问题,我想我错过了动态添加对象的那一点。使用我的解决方案,每次添加对象时都必须调用sortResults函数,这可能会变得昂贵。