1

我有一个非常大的硬编码索引数组,我想轻松地将其转换为关联数组,因此查找速度要快得多。

var arr = ["a", "b", "c"];

现在我正在遍历 arr 并将它的值与一个值进行比较以查看是否匹配。现在我有数百个元素,它变得相当慢,拥有一个关联数组会更快。

看来我不能只做

var arr = {"a", "b", "c"}; 

我无法真正添加价值,因为它太慢了。

当然,我可以将元素复制到关联数组或对数组进行排序并进行二进制搜索,但如果能够为数组元素分配默认值并使用上面的语法会容易得多。

我想这是不可能的吗?

4

4 回答 4

1
var mapLookup = arr.reduce(function (accumalator, value) {
    accumalator[value] = true;
    return accumalator;
}, {});
于 2013-02-17T05:03:28.213 回答
1

为什么不: var arr = {"a":1, "b":1, "c":1};

于 2013-02-17T05:03:50.293 回答
1

大多数现代浏览器都支持Array.indexOf(). -1如果您的搜索没有结果,这将返回。

你真的有速度问题,还是你只是预先优化?您应该使用的容器是一个数组。你有一个元素数组——它们不与任何其他值相关联,那么为什么要把它们放在地图容器中呢?

此外,听起来你想要一个set,你有一组独特的元素。

于 2013-02-17T05:05:51.823 回答
1

将数组转换为关联数组似乎是最简单且非常快速的:

var arr = ["a", "b", "c"];
var arrA = {}; for(var i = 0; i < arr.length; i++) arrA[arr[i]] = 0;

然后只key in arrA用于 O(1) 查找。(不必显式地为键提供值的能力会更容易,但是......)

本质上

if (key in arrA) ...

替换

for(var i = 0; i < arr.length; i++) if (key == arr[i]) ...

当在循环内使用时,这本质上是 O(n) vs O(n^2)。

于 2013-02-17T05:11:53.513 回答