我有一个数组,在其中我已经在不同的索引中添加了3个数据,如下所示:
var a=[];
a[1]=4;
a[3]=7;
a[4]=8;
现在我的数组看起来是这样的。
a=[undefined, 4, undefined, 7, 8, undefined]
我想从数组中单独取出值并将其添加到另一个数组中。是否有最简单的方法可以使用?目前我正在使用“for”循环来获取该值,当数据量较小时这样做是可以的。在这里我只需要3个值,但循环执行了6次。
提前致谢。
我有一个数组,在其中我已经在不同的索引中添加了3个数据,如下所示:
var a=[];
a[1]=4;
a[3]=7;
a[4]=8;
a=[undefined, 4, undefined, 7, 8, undefined]
大多数数组方法都会跳过“空洞”。
如果您不希望明确地过滤它们,只需在它们上调用一个数组方法即可:
var arr = a.filter(function(){return true});
或缩写:
[,4,,7,8].filter(function(){ return true}); // [4, 7, 8]
a.filter(isFinite)
。 - elclanrsmap(Number)
):) 我看到的唯一问题是数组中不是数字的值,或者已声明但未定义的数组值。例如,对于带有空洞的数组 - [undefined]
应该变成 [undefined]
,而 [,,]
应该变成 []
。 - Benjamin Gruenbaum.filter(Number)
将过滤掉零,而isFinite
不会。 - elclanrs你需要的是过滤器函数。
var newArray = a.filter(function(item) {
return item !== undefined;
});
typeof
检查其是否为undefined。使用typeof var !== 'undefined'
是为了在标识符不存在时使用。函数参数会自动声明并分配“undefined”,因此您可以使用item !== undefined
。 - Benjamin Gruenbaum原始数组:
var originalArr = [];
a[1] = 4;
a[3] = 7;
a[4] = 8;
过滤器逻辑:
function filterUndefined(originalArr){
var valuesArray = [];
for(var i = 0; i < originalArr.length; i++){
if(originalArr[i] !== undefined){
valuesArray.push(a[i]);
}
return valuesArray;
}
}
结果:
[4,7,8]
问题在于,每当您在数组中设置一个索引,而其他先前的索引不存在时,您的数组会将它们添加为未定义的值。如果您在此数组中有大量数据,则这不是一个好的做法。
您可以使用过滤器来过滤未定义的值,但问题在于,当数组具有大量数据时,您所做的是创建2个数组,其中第一个数组具有许多带有未定义值的索引,这不是一个好的做法。我认为这更像是一个HashMap
而不是Array
。
如果我是您,我会改用JavaScript对象,并像数组一样循环遍历它,您可以这样做:
var a={};
a[1]=4;
a[3]=7;
a[4]=8;
var keys = Object.keys(a);
for(var i=0;i<keys.length;i++){
var value = a[keys[i]];
//do whatever you want
}
> var a={};
> a[1]=4;
> a[3]=7;
> a[4]=8;