//修正了一个拼写错误[]应该是[[]] //抱歉 //但我仍然难过 //我想初始化一个空数组,其中包含正确的维数,而不是正确的元素数。
我收到以下行为。
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,幸运的是我。
答案 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;