javascript - 稀疏数组在 JavaScript 中有哪些用例?

标签 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具体为:

The length property of this Array object is a data property whose value is always numerically greater than the name of every deletable property whose name is an array index.

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

事实上,根据标准,任何大于3Number都是arr的有效length ,包括 Math.PI

因此,这是否意味着任何人都不应该使用:

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

相反,使用它会更合适

for(key in arr)
    //Always exists

我从来没有在野外遇到过故意的,真的只是在阅读这里的一个奇怪的问答时才开始思考它,现在我有点不安。

我早就知道没有一种巧妙的方法可以从 Array 中删除一个元素,但现在我更加困惑为什么你会故意留下一个洞,更不用说定义了一个标准,其中长度可以是大于最后定义的元素的任何数字。

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

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

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

对不起,如果这有点抽象。想了一个晚上。

最佳答案

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

开始时,您的 map 是一个包含 X × Y 元素的空数组。加载您的数据,并通过递增相关坐标处的数组元素将其填充到 map 中。

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

这并不是说这是做到这一点的唯一方法,甚至是最好的方法——这两个例子都可以在不使用稀疏数组的情况下很容易地实现——但问题是询问用例,所以你去吧.

关于javascript - 稀疏数组在 JavaScript 中有哪些用例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20126593/

相关文章:

PHP数组性能

javascript - 正则表达式替换任何不在单词之前的内容

javascript - 创建一个基于 HTML 类和名称初始化自身的 jQuery 插件

php - in_array 的随机错误

javascript - 将 promise 变量拆分为命名变量

C - 结构体指针数组,语法

javascript - D3.js:如果我添加这两个语句,为什么条形图会翻转

javascript - JQuery UI 自动完成 AJAX 调用

javascript - 如何在 VSCode 和 WebStorm 中将 CSS/SCSS/PostCSS 写入 React .tsx 文件作为 JavaScript 字符串?

javascript - 在 Javascript 中单击按钮更改图像