javascript 定义二维数组,两列,未知行数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javascript 定义二维数组,两列,未知行数相关的知识,希望对你有一定的参考价值。

就是用javascript定义这样的数组arr[?][2]前面是未知数,随着需要增加而增长

javascript定义二维数组的方法

1、是用一维数组来模拟二维数组

     这种方法不是很好,有点麻烦,而且容易出错


2、将一维数组的分项又定义为一个一维数组

       javascript本身只支持一维数组, 有时非要用到二维数组的时候, 可以将一维数组的分项又定义为一个数组, 二维数组就是用数组构成的数组 

var items=new Array(); //定义一维数组 
for(i=1;i<=10;i++) 
 
    items[i]=new Array(); //将每一个子元素又定义为数组 
    for(n=0;n<=10;n++) 
     
        items[i][n]=i+n; //此时items[i][n]可以看作是一个二级数组 
     
参考技术A 可以的。只要列数固定,就符合语法规范。 参考技术B js的数组长度本来就是不确定的。
var arr = new Array();
arr.push([1,2]);
arr.push([1,2]);
....
你可以无限的添加下去,这不就是不确定长度吗?本回答被提问者采纳

在 Perl 中修改然后切片未知大小的二维数组

【中文标题】在 Perl 中修改然后切片未知大小的二维数组【英文标题】:Modifying then Slicing 2D Array of Unknown Size in Perl 【发布时间】:2013-04-12 05:31:56 【问题描述】:

我知道这里已经涵盖了类似的主题,但是我遇到了一个问题,我认为这是由于我误解了如何在 foreach 循环的上下文中插入数组切片。我不知道哪里出了问题,所以我正在寻找一些见解。

我有一个行数可变的二维数组。例如目的:

@2DArray = (['str1', 1, 2, 'E', val1, val2, val3]
            ['str2', 3, 4, 'E', val4, val5, val6]
            ['str4', 5, 6, 'F', val7, val8, val9])   

我想构建一个带有附加列的新数组,仅当原始数组的某些行在第 3 列中包含字符串“E”时才包含这些行。此外,对于我确实希望合并到我的行中的行新数组,我只想要列的一个子集,并且我希望该子集以不同的顺序排列。最终目标是生成下游脚本所需的正确格式的输出。

这是我的尝试:

my $projName = 'test';

my $i = 1;
my @Newarray
my @Newarray_element;
     foreach (@2DArray) 
         if  ($$_[3] eq 'E') 
             $$_[3] = $i; 
             $$_[5] = '+'; 
             @Newarray_element = ("$projName$i", @$_[0,1,2,5,3], 'STR', 11, 11);
             $i++;
             push (@Newarray, \@Newarray_element);
         

         next;
     

print (join("\t", @$_), "\n") for @Newarray;

但是,如果我这样做,我得到的是:

#(original) col nums:      0       1    2    5    3

                  test2    str2    3    4    +    2    STR    11    11
                  test2    str2    3    4    +    2    STR    11    11

也就是说,我的新数组将在原始数组中的每一行都有一行,在第 3 列中带有一个“E”,但每一行都填充了要由循环处理的最后一行的值。

我认为问题与在 foreach 循环中切片二维数组有关的原因是,我知道我是否只是循环遍历二维数组,在第 3 列中找到所有带有“E”的行,修改一些值在这些行的其他列中,然后将其返回到一个新数组中,这一切都很好。也就是说,如果我改为这样做:

my @Newarray;
my $i = 1;
foreach (@2Darray) 
    if  ($$_[3] eq "E") 
        $$_[3] = $i;
        $$_[5] = '+';
        $i++;
        push (@Newarray, \@$_);
    
    next;   

print (join("\t", @$_), "\n") for @Newarray;

我得到了我期望的输出:

                  *            &
str1    1    2    1    val1    +    val3
str2    3    4    2    val4    +    val6

其中 * 和 & 标记的列是修改后的第 3 和 5 列。让猛攻开始:我的新手自己哪里出错了?

【问题讨论】:

【参考方案1】:

变量@Newarray_element 指向整个程序中的相同内存空间,因此您在一次迭代中所做的更改会传播到您在分配中使用该变量的先前迭代。

两个可能的修复:

一个。更改变量的范围,使其在每次迭代中使用不同的内存。 改变

my @Newarray_element;
foreach (@2DArray) 
    ...

foreach (@2DArray) 
    my @Newarray_element;
    ...

甚至

foreach (@2DArray) 
    ...
    my @Newarray_element = ("$projName$i", @$_[0,1,2,5,3], 'STR', 11, 11);

两个:重用@Newarray_element,但将其数据的副本分配给@Newarray的每一行。改变

push (@Newarray, \@Newarray_element);

push (@Newarray, [ @Newarray_element ]);

后一个调用创建一个新的匿名数组引用并将其附加到@Newarray

【讨论】:

谢谢。一个非常愚蠢的错误,证明我还没有掌握 Perl 引用。您能否在第二个示例中向我解释 [@New_element] 到底在做什么?如果我没看错,那是否会创建一个匿名数组,其中包含 @Newarray_element 的内容,在循环关闭时会丢失? @MCor: 是的,[ @Newarray_element ] 制作了 @Newarray_element 内容的匿名副本(并返回对该副本的引用),这样当您在下一次迭代时覆盖 @Newarray_element循环,副本仍将保留原始内容。 (但是,通过在循环中移动 my 声明,在每次迭代中创建一个新的本地数组会更简洁。) [ ... ] 生成一个新的匿名数组引用,该引用将被推送到@Newarray。该引用指向的数组的内容将是@Newarray_element 中内容的副本。由于每个都是副本,因此每次循环更改@Newarray_element 都没有关系。但是@mob 的第一个建议是更清晰、更惯用的方法。将变量范围限定在循环内部每次都会创建一个 new \@Newarray_element

以上是关于javascript 定义二维数组,两列,未知行数的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript -- 定义二维数组

如何在C中声明具有两列和未知行数的矩阵

在 Perl 中修改然后切片未知大小的二维数组

当行数未知时,使用 javascript 更改行的类

javascript怎么实现如下所述二维数组去重

JavaSE7基础 定义二维数组 不固定的列数 固定的行数