定义没有值的关联数组

时间:2013-02-17 05:00:11

标签: javascript

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

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

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

似乎我不能只做

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

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

当然,我可以将元素复制到关联数组或对数组进行排序并进行二分查找,但只需将默认值分配给数组元素并使用上面的语法就会容易得多。

我想这不可能吗?

4 个答案:

答案 0 :(得分:1)

var mapLookup = arr.reduce(function (accumalator, value) {
    accumalator[value] = true;
    return accumalator;
}, {});

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

此外,听起来你想要一个set,你有一个唯一的元素集。

答案 3 :(得分: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)。

相关问题