JavaScript中的稀疏数组有哪些用例?

时间:2013-11-21 16:30:41

标签: javascript arrays

在稀疏数组优于(常规)对象的情况下,您可以使用哪种编程方法?

通过稀疏数组我的意思是:

arr = [];                             //Initialize
arr[0] = 'W';
arr[1] = 'T';
arr[3] = 'F';

console.log(arr[0] !== undefined)    //true
console.log(arr[1] !== undefined)    //true
console.log(arr[2] === undefined)    //true
console.log(arr[3] !== undefined)    //true

或者更正式地说:

An object, O, is said to be sparse if the following algorithm returns true:

1. Let len be the result of calling the [[Get]] internal method of O with argument 
"length".

2. For each integer i in the range 0≤i<ToUint32(len)
    a. Let elem be the result of calling the [[GetOwnProperty]] internal method of O     
    with argument ToString(i).

    b. If elem is undefined, return true.

3. Return false.

ECMA 262 5.1 - 15.4 Array Objects

此外,ECMA 262 5.1标准进一步将length定义为:

  

此Array对象的length属性是一个data属性,其值始终在数值上大于名称为数组索引的每个deletable属性的名称。

所以上面的例子,arr.length === 4尽管只定义了三个元素。

事实上,根据标准,任何大于Number的{​​{1}}都是3的有效length,包括arr

因此,这是否意味着没有人应该使用:

Math.PI

而是使用

更合适
for(var i=0; i<arr.length; i++)
    //Cannot trust arr[i] exists

我从来没有在野外遇到过故意的人,而且在这里阅读一个奇怪的Q&amp; A时才开始考虑它,现在我有点不稳定了。

我早就知道没有一种简洁的方法可以从for(key in arr) //Always exists 删除一个元素,但是现在我更加困惑为什么你会故意留下一个洞,更不用说定义一个标准了length可以是大于最后定义元素的任何数字。

如果我想要随机键值对,我会使用Array。如果我想能够干净地迭代,我使用Object。我错过了什么吗?

注意,我正在寻找一个特定的用例,或者一类不参考标准或意见的一般用例。我知道这是允许的,我已经有了意见。 :)

要添加测试或查看我看到的Array标准以意想不到的方式工作的一些测试,请查看此fiddle

很抱歉,如果这有点抽象。整晚都在考虑它。

2 个答案:

答案 0 :(得分:2)

我在实际使用中遇到的稀疏数组的一个可能用例是热图。

从地图开始是一个空的X×Y元素数组。加载数据,并通过递增相关联合的数组元素将其填充到地图中。

另一个类似的例子可能是战舰游戏,通过在适当的坐标处填充数组元素,将船放入空网格中。

这并不是说这是实现这一目标的唯一方法,甚至是最好的方式 - 两个例子都可以很容易地实现而不使用稀疏数组 - 但问题是要求用例,所以你去

答案 1 :(得分:0)

这取决于您对“稀疏数组”的定义。例如,您想用类似的代码表达

“ 2件产品51472和1件产品81369”

然后,根据一个可能的定义(也可以称为“数学”定义),您认为要在代码中表达的是“稀疏数组”。没错,思想用例。正确的实现是使用普通对象{}

在上述情况下,“稀疏数组”的另一个可能的定义是,仅仅因为所有出现的键都是自然数,您认为它应该是一个数组([])-a,可以这么说,“ javascriptological”的定义。 “稀疏数组”的第二个定义绝对没有用例。零。这是错误的。非常非常非常非常非常错误。坏。纯粹是100%不好,不是善良原子的一小部分。

这是完全没有必要的,因为{}可以满足您的要求,而使用[]可以使您编写效率低下的慢速代码,但是直到几年后您才发现错误。不要这样做。

那怎么办? read this