使用另一个数组创建JavaScript数组

4

我有一个数组,在其中我已经在不同的索引中添加了3个数据,如下所示:

  var a=[];
   a[1]=4;
   a[3]=7;
   a[4]=8;

现在我的数组看起来是这样的。
 a=[undefined, 4, undefined, 7, 8, undefined]

我想从数组中单独取出值并将其添加到另一个数组中。是否有最简单的方法可以使用?目前我正在使用“for”循环来获取该值,当数据量较小时这样做是可以的。在这里我只需要3个值,但循环执行了6次。
提前致谢。

顺便提一下 - 稀疏数组与整个数组相比非常慢。数组中的“空洞”会导致JS引擎性能大幅下降,并且会导致非常糟糕的“去优化”。另一方面,完整的数组几乎与C数组一样快。如果您解释使用情况(为什么在数组中有这些空洞),我们可能会给出更好的指导答案。我还没有看到过它们的合理用例(也许今天我会感到惊讶 :))。 - Benjamin Gruenbaum
5个回答

4

大多数数组方法都会跳过“空洞”。

如果您不希望明确地过滤它们,只需在它们上调用一个数组方法即可:

var arr = a.filter(function(){return true});

或缩写:

[,4,,7,8].filter(function(){ return true}); // [4, 7, 8]

1
如果只是数字,您也可以使用a.filter(isFinite) - elclanrs
@elclanrs,说实话我也考虑过这个方法(或者map(Number)):) 我看到的唯一问题是数组中不是数字的值,或者已声明但未定义的数组值。例如,对于带有空洞的数组 - [undefined] 应该变成 [undefined],而 [,,] 应该变成 [] - Benjamin Gruenbaum
1
是的,我猜它有一个非常具体的用途。顺便说一下,.filter(Number)将过滤掉零,而isFinite不会。 - elclanrs

1

你需要的是过滤器函数。

var newArray = a.filter(function(item) {
  return item !== undefined;
});

1
请注意,当您拥有一个未定义但已声明的变量时,不需要使用typeof检查其是否为undefined。使用typeof var !== 'undefined'是为了在标识符不存在时使用。函数参数会自动声明并分配“undefined”,因此您可以使用item !== undefined - Benjamin Gruenbaum
@BenjaminGruenbaum 不知道这个。我会更新我的答案。谢谢 :) - Jim Jeffries

0

原始数组:

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]

0

问题在于,每当您在数组中设置一个索引,而其他先前的索引不存在时,您的数组会将它们添加为未定义的值。如果您在此数组中有大量数据,则这不是一个好的做法。

您可以使用过滤器来过滤未定义的值,但问题在于,当数组具有大量数据时,您所做的是创建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
}

0
你可以考虑使用“键/值”对象代替数组。
> var a={}; 
> a[1]=4; 
> a[3]=7; 
> a[4]=8;

请注意,不同之处在于声明“a”的方式:a={} 而不是 a=[]。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接