Javascript数组初始化行为

时间:2015-12-18 23:47:23

标签: javascript arrays

//修正了一个拼写错误[]应该是[[]] //抱歉 //但我仍然难过 //我想初始化一个空数组,其中包含正确的维数,而不是正确的元素数。

我收到以下行为。

var sdata = [[]];
sdata[0][0] = 4;
sdata[0][1] = 5;

它有效。

但是

var sdata = [[]];
sdata[0][0] = 4;
sdata[0][1] = 5;
sdata[1][0] = 6;

不起作用,意思是第三个元素。

然而

var sdata = [[]];
    sdata[0] = [];
    sdata[1] = [];
sdata[0][0] = 4;
sdata[0][1] = 5;
sdata[1][0] = 6;

也有效。

这意味着我不能只创建一个空数组并给它赋值。我必须计算它将有多少行,然后初始化一个长度很长的空数组,然后给它的元素赋值。这是特别愚蠢的,因为我不知道我将获得的数据长度。

当我说它不起作用时,这意味着console.log打印vs不打印。

更新:是的,这是愚蠢的。但是有一条银线 - 你只需要在第一级进行初始化。当你给它们一个值时,下面的级别会自动初始化。

基本上,以下内容将起作用

var sdata = [[]];
sdata[0][0]= 4;  // first element initialization is not a problem
sdata[0][1]= 4;  // still falls under first

但跟随不会

var sdata = [[]];
sdata[0][0]= 4;
sdata[0][1]= 4;
sdata[1][0]= 4; // no it wont, anything after first parent element requires explicit initialization

所以以下

var sdata = [[]];
sdata[0]=[]
sdata[1]=[]     // explicit initialization
sdata[0][0]= 4;
sdata[0][1]= 4;
sdata[1][0]= 4; // now it will

但是以下内容也会起作用

var sdata = [[]];
sdata[0]=[]
sdata[1]=[]
sdata[0][0]= 4;
sdata[0][1]= 4;
sdata[1][0]= 4;    // expected to work and will
sdata[1][1]= 4;    // expected to work and will
sdata[1][0][0]=5;  // expected to work since its first element and will
sdata[1][1][1]=5;  // expected not to work since its the second element , but it will work, since parent is initialized

底线 - 只需要第一级初始化,低于此级别不是问题。

所以现在我基本上在做

for (x=0;x<y;x++)
        { sdata[x] = []; }  
sdata[c][d][e] = 4; // and so forth

我必须事先知道y,幸运的是我。

3 个答案:

答案 0 :(得分:5)

  

这意味着我不能只创建一个空数组并给它赋值。我必须计算它将有多少行,然后初始化一个长度很长的空数组,然后给它的元素赋值。这是特别愚蠢的,因为我不知道我将获得的数据长度。

是的,这很愚蠢。这是愚蠢的,因为计算机是愚蠢的。处理它。当然,很多人在你面前解决了这个问题。

解决这个问题的一种方法是强制用户给你JSON。这真的很容易。而不是试图写

 
var sdata = [[]];
sdata[0][0] = 4;
sdata[0][1] = 5;
sdata[1][0] = 6;

你可以粘贴他们给你的东西:

var sdata = [[4,5],[6]];

这非常容易,如果出现问题,你可以责怪用户。

您可以做的另一件事是寻找哪种数据边界表示新行。例如,在解析CSV时,您会查找换行符并递增行索引,然后在输出文本上附加一个新数组。

最后,如果你坚持写出来,只需修改原始数组!您可以轻松编写以下内容:

var sdata = [];
sdata[0] = [];
sdata[0][0] = 4;
sdata[0][1] = 5;
sdata[1] = [];
sdata[1][0] = 6;

如果你整体上写着“写得太多”,那就太过分了。

答案 1 :(得分:0)

您的陈述:

var sdata = [];
sdata[0][0] = 4;
sdata[0][1] = 5;

应该失败,并使用node(node.js)运行它,它会:

$ node
> var sdata = [];
undefined
> sdata[0][0] = 4;
TypeError: Cannot set property '0' of undefined
    at repl:1:13
    at REPLServer.defaultEval (repl.js:133:27)
    at bound (domain.js:254:14)
    at REPLServer.runBound [as eval] (domain.js:267:12)
    at REPLServer.<anonymous> (repl.js:280:12)
    at REPLServer.emit (events.js:107:17)
    at REPLServer.Interface._onLine (readline.js:206:10)
    at REPLServer.Interface._line (readline.js:535:8)
    at REPLServer.Interface._ttyWrite (readline.js:812:14)
    at ReadStream.onkeypress (readline.js:108:10)

原因是sdata[0]返回undefined

> sdata[0]
undefined

现在如何将项目添加到undefined(您可以&#34;比较&#34;与null指针)。您至少需要一个对象来添加项目。

您可以通过生成一些 guard 模式来解决问题:

function add_data (sdata,i,j,x) {
    var obj = sdata[i];
    if(obj === undefined) {
        obj = [];
        sdata[i] = obj;
    }
    obj[j] = x;
}

然后您可以致电:

var sdata = [];
add_data(sdata,0,0,4);
add_data(sdata,0,1,5);
add_data(sdata,1,0,5);

并将导致:

> sdata
[ [ 4, 5 ], [ 5 ] ]

答案 2 :(得分:0)

多维数组并不存在...... 试试这个解决方案:

if ( sdata[ x ] === undefined) sdata[ x ] = [];
sdata[ x ] [ y ] = yourValue;