我有一个操纵Item
对象的脚本。每个项目都有唯一的属性集(a
,b
和c
),让我们称之为坐标。
我创建了包含Collection
数组的items
对象。现在我可以通过索引快速找到它们。
我也希望通过坐标找到它们。我实现了使用哈希的方法findByAbc
。如果指定了所有三个坐标,则效果很好。
但是现在我想通过一个或两个坐标来实现搜索,所以它应该返回项目数组。我创建了findCustom
方法,它迭代所有项目并比较它们的坐标。但这种实施很慢。
是否可以快速搜索?
请参阅示例:http://jsfiddle.net/29zguzs5/
我想用两个坐标实现搜索:
findByAb: (a, b)->
aItems = @findByA(a)
bItems = @findByB(b)
items = findCommonItems(aItems, bItems)
但我认为比较两个阵列也很慢。
那么,您对如何实施它有什么想法吗?
UPD。
我认为Collection是一个多维(3d)数组(或哈希)。如果仅指定两个索引,则应返回一行项。也许有一些现有的实现?
答案 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。