我有一个元素数组,其中的条目是稀疏的。如何轻松地将稀疏数组压缩为密集数组,这样就不必在每次循环数据时都检查空值和未定义的值?
以下是一些示例数据:
var sparse = [];
sparse[1] = undefined;
sparse[5] = 3;
sparse[10] = null;
var dense = sparseToDenseArray(sparse);
// dense should be [3]发布于 2012-07-26 07:22:54
在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]发布于 2012-07-26 07:16:37
你可以使用兼容火狐、Chrome、IE9、Opera和Safari浏览器的filter()。
根据David Flanagan的说法,在Javascript: The Definitive Guide中,将稀疏数组转换为密集数组的一种简单方法是对其使用过滤器,如下所示:
var dense = sparse.filter(function (x) { return x !== undefined && x != null; });这是因为filter()会跳过丢失的元素,并且只有在x不是undefined或null时才返回true。
如果不支持filter(),这将压缩一个稀疏数组:
var compacted = [];
for(var i = 0; i < sparse.length; i++)
if(i in sparse)
compacted.push(sparse[i]);与filter()示例完全等效的是:
var compacted = [];
for(var i = 0; i < sparse.length; i++)
if(sparse[i] != null)
compacted.push(sparse[i]);发布于 2017-01-23 16:48:48
在ES2017 (ES8)中,这和Object.values(sparseArray)一样简单
例如:
const sparseArray = [, , 'foo', 'bar', , 'baz', ,];
const compactArray = Object.values(sparseArray);
console.log(compactArray);
但请注意,此方法仅删除间隙,根据需要向下移动现有数组元素的索引。它不会删除显式设置为undefined或null的元素。
https://stackoverflow.com/questions/11660090
复制相似问题