在Javascript中压缩稀疏数组?

Iva*_*van 4 javascript arrays sparse-array

我有一个元素数组,其中条目是稀疏的.如何轻松地将稀疏数组压缩成密集数组,以便每次循环数据时都不必一直检查空值和未定义值?

以下是一些示例数据:

var sparse = [];
sparse[1] = undefined;
sparse[5] = 3;
sparse[10] = null;

var dense = sparseToDenseArray(sparse);
// dense should be [3]
Run Code Online (Sandbox Code Playgroud)

Iva*_*van 11

您可以使用filter()与Firefox,Chrome,IE 9,Opera和Safari Web浏览器兼容的软件.

根据David Flanagan的说法,在Javascript:The Definitive Guide中,将稀疏数组转换为密集数组的简单方法是在其上使用过滤器,如下所示:

var dense = sparse.filter(function (x) { return x !== undefined && x != null; });
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为filter()跳过缺少的元素,只有true当x不是undefined或时才返回null.

如果filter()不支持,这将压缩稀疏数组:

var compacted = [];

for(var i = 0; i < sparse.length; i++)
    if(i in sparse)
        compacted.push(sparse[i]);
Run Code Online (Sandbox Code Playgroud)

这个filter()例子的确切等价物是:

var compacted = [];

for(var i = 0; i < sparse.length; i++)
    if(sparse[i] != null)
        compacted.push(sparse[i]);
Run Code Online (Sandbox Code Playgroud)


GOT*_*O 0 5

在ES2017(ES8)中,这很简单 Object.values(sparseArray)

例如:

const sparseArray = [, , 'foo', 'bar', , 'baz', ,];
const compactArray = Object.values(sparseArray);
console.log(compactArray);
Run Code Online (Sandbox Code Playgroud)

请注意,此方法仅删除间隙,根据需要向下移动现有数组元素的索引.它不会删除显式设置为undefined或的元素null.


Lyn*_*ley 4

在 vanilla JS 中,适用于所有浏览器:

function filt(a) { 
 var b = []; 
 for(var i = 0;i < a.length;i++) { 
  if (a[i] !== undefined && a[i] !== null) { 
   b.push(a[i]); 
  }
 } 
 return b; 
}

> filt([1,undefined,3])
[1, 3]
Run Code Online (Sandbox Code Playgroud)