动态数组创建后尝试将值动态推送到数组中不起作用

时间:2015-11-18 07:55:50

标签: javascript jquery arrays

我有3个数组如下:

我动态创建的

var count =3;
for (var j = 0; j < count; j++) {
        eval('var array' + j + '=[]');
    }

array0[] , array1[], array2[] 

还有另一个阵列:

var arraycomp = [1,2,3];

我有另一个阵列:

var valarray = [1,2,3,2,1,3,1,2,3,2,3,4,5,6,7]

我的工作如下:

for(var k=0;k<arraycomp.length;k++){
 for(var i=0;i<valarray.length;i++){
   if(valarray[i]==arraycomp[k]){
     var arrayname = "array"+k;
     arrayname.push(valarray[i]);
   }
 }
}

我需要的是:

 array0[] having 1's
 array2[] having 2's       
 array3[] having 3's  

但它不起作用:

我收到错误:

var arrayname = "array"+k;
arrayname.push(valarray[i]);  

错误是:

  

无法推送到arrayname

我尝试了另一种选择:

var arrayname = "array"+k;
var len = arrayname .length;
arrayname [len ] = valarray[i];

如何将其视为数组:var arrayname = "array"+k;它将变量视为变量。

3 个答案:

答案 0 :(得分:2)

在这里,您尝试将值推送到字符串。

var arrayname = "array"+k;
arrayname.push(valarray[i]);

因为这两个在JS中是等价的:

var x = 1;
this.x = 1;

这两个也是等价的:

obj[prop]
obj.prop

您可以使用动态生成的字符串名称以这种方式访问​​变量:

var arrayname = "array"+k;
this[arrayname].push(valarray[i]);

您可能还想以相同的方式声明它:

var count =3;
for (var j = 0; j < count; j++) {
    //eval('var array' + j + '=[]');
    this['array' + j] = [];
}

但是,通常情况下,evalthis[]的所有这些操作都是错误的。你可以定义一个数组数组,一个带数组的对象或其他任何东西 - 任何东西都比以这种方式创建变量更好。

答案 1 :(得分:1)

而不是:

var arrayname = "array"+k;
arrayname.push(valarray[i]);

使用:

var arrayname = "array"+k;
var window[arrayname].push(valarray[i]);

那是因为arrayname是一个字符串(“array0”,“array1”等)。

只有在全局范围内调用arrayname(即不是来自函数)时,才能访问窗口对象上的eval

eval('var array' + j + '=[]');替换为eval('window.array' + j + '=[]');作为解决方法。

或者更好的是,如果动态代码真的你需要的东西,可以使用escodegenestemplate或其他一些基于AST的工具进行元编程。

答案 2 :(得分:1)

以下代码不起作用。

if(valarray[i]==arraycomp[k]){
    var arrayname = "array"+k;
    arrayname.push(valarray[i]);
}

(“array”+ k)仍然是像“array0”或“array1”这样的字符串。它不是一个数组,所以不可能将它用作数组。您可以尝试使用eval()来获取数组实例,但是@Rory指出您不应该使用eval()。它是Javascript的罪恶之一,并且具有非常具体的用例,创建Arrays不是其中之一。

您可以尝试为您的程序创建一个二维数组,如下所示

var count =3;
var my2dArr = [];
var arraycomp = [1,2,3];
var valarray = [1,2,3,2,1,3,1,2,3,2,3,4,5,6,7]

for (var j = 0; j < count; j++) {
    my2dArr.push([]);
}
for(var k=0;k<arraycomp.length;k++){
    for(var i=0;i<valarray.length;i++){
        if(valarray[i]==arraycomp[k]){
            my2dArr[k].push(valarray[i]);
        }
    }
}

在Javascript中,2d数组只是一个数组数组,因此所有子数组都可以有任意长度。