首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript数组初始化行为

Javascript数组初始化行为
EN

Stack Overflow用户
提问于 2015-12-19 07:47:23
回答 3查看 52关注 0票数 2

//修复了拼写错误[]应该是[[]] //抱歉//但我仍然困惑。//我想用正确的维数而不是正确的元素数来初始化一个空数组。

我得到了以下行为。

代码语言:javascript
复制
var sdata = [[]];
sdata[0][0] = 4;
sdata[0][1] = 5;

它起作用了。

代码语言:javascript
复制
var sdata = [[]];
sdata[0][0] = 4;
sdata[0][1] = 5;
sdata[1][0] = 6;

不起作用,这意味着第三个元素。

然而,

代码语言:javascript
复制
var sdata = [[]];
    sdata[0] = [];
    sdata[1] = [];
sdata[0][0] = 4;
sdata[0][1] = 5;
sdata[1][0] = 6;

也是有效的。

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

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

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

因此,基本上,下面的方法是可行的

代码语言:javascript
复制
var sdata = [[]];
sdata[0][0]= 4;  // first element initialization is not a problem
sdata[0][1]= 4;  // still falls under first

但遵循习惯

代码语言:javascript
复制
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

因此,下面的代码将

代码语言:javascript
复制
var sdata = [[]];
sdata[0]=[]
sdata[1]=[]     // explicit initialization
sdata[0][0]= 4;
sdata[0][1]= 4;
sdata[1][0]= 4; // now it will

不过,下面的方法也可以用

代码语言:javascript
复制
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

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

所以我现在基本上是在做

代码语言:javascript
复制
for (x=0;x<y;x++)
        { sdata[x] = []; }  
sdata[c][d][e] = 4; // and so forth

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

EN

回答 3

Stack Overflow用户

发布于 2015-12-19 07:51:46

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

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

解决这个问题的一种方法是强制用户给你JSON。,这真的很简单。现在,与其尝试编写

代码语言:javascript
复制
var sdata = [[]];
sdata[0][0] = 4;
sdata[0][1] = 5;
sdata[1][0] = 6;

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

代码语言:javascript
复制
var sdata = [[4,5],[6]];

这非常简单,如果出了问题,你可以责怪用户。

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

最后,如果你坚持要把它写出来,只要修改原始数组就行了!您可以很容易地编写以下代码:

代码语言:javascript
复制
var sdata = [];
sdata[0] = [];
sdata[0][0] = 4;
sdata[0][1] = 5;
sdata[1] = [];
sdata[1][0] = 6;

如果你对这个“写得太多”的把戏感兴趣。

票数 5
EN

Stack Overflow用户

发布于 2015-12-19 07:58:28

您的声明:

代码语言:javascript
复制
var sdata = [];
sdata[0][0] = 4;
sdata[0][1] = 5;

如果失败,并使用node (node.js)运行此命令,它会这样做:

代码语言:javascript
复制
$ 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

代码语言:javascript
复制
> sdata[0]
undefined

现在如何将项目添加到undefined (可以用null指针“比较”)。您至少需要一个要向其中添加项的对象。

你可以简单地通过生成一些保护模式来解决这个问题:

代码语言:javascript
复制
function add_data (sdata,i,j,x) {
    var obj = sdata[i];
    if(obj === undefined) {
        obj = [];
        sdata[i] = obj;
    }
    obj[j] = x;
}

然后,您可以使用以下命令调用它:

代码语言:javascript
复制
var sdata = [];
add_data(sdata,0,0,4);
add_data(sdata,0,1,5);
add_data(sdata,1,0,5);

并将导致:

代码语言:javascript
复制
> sdata
[ [ 4, 5 ], [ 5 ] ]
票数 0
EN

Stack Overflow用户

发布于 2015-12-19 08:05:00

多维数组并不真正存在...尝试此解决方案:

代码语言:javascript
复制
if ( sdata[ x ] === undefined) sdata[ x ] = [];
sdata[ x ] [ y ] = yourValue;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34365631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档