【问题标题】:Efficient Sorted Data Structure in JavaScriptJavaScript 中的高效排序数据结构
【发布时间】:2014-10-02 07:53:56
【问题描述】:

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

一个示例对象:

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

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

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

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

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

谁有解决这个问题的好办法?

【问题讨论】:

  • 假设你不添加索引属性,你怎么知道在获取记录时使用什么索引?
  • @Johan 在插入点我想我需要它给出的索引,所以如果我插入 a、c 和 b,a === 索引 0,b === 1 和 c = == 2. 或者,在插入之后,如果结构可以展平为数组,我可以执行 indexOf() 来查找当前索引,尽管这将使用线性搜索,因此效率不高。
  • 如果您真的关心查找复杂性,我认为以索引为键的普通对象将比数组上的indexOffor 等更快。

标签: javascript json sorting indexing


【解决方案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);

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

您可以使用示例 HERE。如果我遗漏了任何内容或无法正确理解您的问题,请随时解释,我会调整我的解决方案。

编辑: 再次检查您的问题,我想我错过了动态添加对象位。使用我的解决方案,每次添加可能会变得昂贵的对象时,您都必须调用 sortResults 函数。

【讨论】:

  • 嘿,谢谢。是的,数组的基本排序很简单,尽管您的解决方案仅按名称排序,而不是按 dob 排序。复杂的部分是以升序和降序处理多个属性的排序,同时也不是每次都为每个新项目调用排序...
  • 是的.. 后来想通了。为此你是对的某种树或者你为什么不去散列?
猜你喜欢
  • 2013-02-26
  • 2015-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-12
相关资源
最近更新 更多