快速搜索集合中的项目

时间:2014-12-28 19:04:45

标签: javascript arrays search

我有一个操纵Item对象的脚本。每个项目都有唯一的属性集(abc),让我们称之为坐标。

我创建了包含Collection数组的items对象。现在我可以通过索引快速找到它们。

我也希望通过坐标找到它们。我实现了使用哈希的方法findByAbc。如果指定了所有三个坐标,则效果很好。

但是现在我想通过一个或两个坐标来实现搜索,所以它应该返回项目数组。我创建了findCustom方法,它迭代所有项目并比较它们的坐标。但这种实施很慢。

是否可以快速搜索?

请参阅示例:http://jsfiddle.net/29zguzs5/

我想用两个坐标实现搜索:

findByAb: (a, b)->
  aItems = @findByA(a)
  bItems = @findByB(b)
  items = findCommonItems(aItems, bItems)

但我认为比较两个阵列也很慢。

那么,您对如何实施它有什么想法吗?

UPD。

我认为Collection是一个多维(3d)数组(或哈希)。如果仅指定两个索引,则应返回一行项。也许有一些现有的实现?

1 个答案:

答案 0 :(得分:1)

我认为fasetes用JavaScript做的方法:为每个属性组合创建索引,如下所示:

// Somewhere in constructor
this.indexA = {};
this.indexB = {};
this.indexAB = {};
an so on...

然后用值填充索引。您可以在循环中或在insert()操作时执行此操作:

Collection.prototype.reindex = function(){
    for(var i=0;i<this.items.length;i++) {
        this.indexA[this.items[i].a] = this.items;
        this.indexB[this.items[i].b] = this.items;
        this.indexAB[this.items[i].a+'~'+this.items[i].b] = this.items;
    }
};

Collection.prototype.insert = function(val) {
    this.items.push(val);
    this.indexA[val.a] = val;
    this.indxB[val.a] = val;
    this.indexAB[val.a+'~'+val.b] = val;
}

Collection.prototype.getAB = function(a,b) {
    return this.indexAB[a+'~'+b];
}

这只是函数草案,它们不是通用的(比现成的解决方案更多的想法),但我们在JavaScript SQL数据库库中使用了这种方法,因为它很快。

要创建索引值,您可以使用以下内容:

function createKey(coordArray) {
    return coordArray.join('~');
}

这里'〜'只是不寻常的字符,可以替换为任何其他UNICODE字符,如String.fromCharCode(0)

PS。抱歉,对于JS,而不是CoffeeScript。