首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Javascript中压缩稀疏数组?

在Javascript中压缩稀疏数组?
EN

Stack Overflow用户
提问于 2012-07-26 07:16:37
回答 6查看 4.3K关注 0票数 8

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

以下是一些示例数据:

代码语言:javascript
复制
var sparse = [];
sparse[1] = undefined;
sparse[5] = 3;
sparse[10] = null;

var dense = sparseToDenseArray(sparse);
// dense should be [3]
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-07-26 07:22:54

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

代码语言:javascript
复制
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]
票数 4
EN

Stack Overflow用户

发布于 2012-07-26 07:16:37

你可以使用兼容火狐、Chrome、IE9、Opera和Safari浏览器的filter()

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

代码语言:javascript
复制
var dense = sparse.filter(function (x) { return x !== undefined && x != null; });

这是因为filter()会跳过丢失的元素,并且只有在x不是undefinednull时才返回true

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

代码语言:javascript
复制
var compacted = [];

for(var i = 0; i < sparse.length; i++)
    if(i in sparse)
        compacted.push(sparse[i]);

filter()示例完全等效的是:

代码语言:javascript
复制
var compacted = [];

for(var i = 0; i < sparse.length; i++)
    if(sparse[i] != null)
        compacted.push(sparse[i]);
票数 14
EN

Stack Overflow用户

发布于 2017-01-23 16:48:48

在ES2017 (ES8)中,这和Object.values(sparseArray)一样简单

例如:

代码语言:javascript
复制
const sparseArray = [, , 'foo', 'bar', , 'baz', ,];
const compactArray = Object.values(sparseArray);
console.log(compactArray);

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

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11660090

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档