繁体   English   中英

来自两级数组的对象。 导致意外的令牌[

[英]object from two-level array. causes Unexpected token [

var data=[['a','1'],['b','2']];

这应该很容易成为一个对象

var Obj={data[0][0]:data[0][1],data[1][0]:data[1][1]}

但是反而创建了SyntaxError:Unexpected token [

当我尝试以这种方式构造对象时,为什么JavaScript无法正确看到数组部分? 当在{}对象之外时

console.log(data[0][0]);    // "a"

我很困惑,为什么这会抛出一个错误,好像有一个我不知道的禁止规则。 我是否被迫将数据部分存储在临时变量中? 像这样:

var data=[['a','1'],['b',2]];

var t1=data[0][0]
,   t2=data[0][1]
,   t3=data[1][0]
,   t4=data[1][1];

var obj={t1:t2,t3:t4};     // no error

这似乎对JavaScript的限制太多我在这里肯定遗漏了一些东西!

你不能这样做,它不是对象文字的有效语法:

var Obj= {
     data[0][0]:data[0][1],
     data[1][0]:data[1][1]
}

您不能将变量用作对象文字中的属性名称。 在你的第二个例子中:

var obj={t1:t2,t3:t4};     // no error

你没有得到任何错误,但你也没有得到你所期望的。 如果你看一下生成的对象,你会看到:

{ t1: "1", t3: 2 };

换句话说,您创建了一个具有属性t1t3的对象,而不是ab

您必须创建一个空对象并使用括号表示法[]填充它:

var obj = {};
obj[data[0][0]] = data[0][1];
obj[data[1][0]] = data[1][1];

只要您想将变量用作对象的属性名称,就需要使用括号表示法。 换句话说:

var t1 = "B";
obj[t1] = "foo";

与此不同的是:

var t1 = "B";
obj.t1 = "foo";

在第一种情况下,您将obj上的名为B的属性设置为字符串"foo" 在第二种情况下,您将obj上的属性t1设置为"foo" 对象文字语法更像是使用点表示法。

为了使您想要做的更简单,您可以像@Nikos的回答一样遍历数组。 或者你可以得到花哨和使用.reduce

 var data = [ ['a', '1'], ['b', 2] ]; var obj = data.reduce(function(curr, next) { curr[next[0]] = next[1]; return curr; }, {}); alert(JSON.stringify(obj)); 

我认为这对你想做的事情来说要简单得多。

var data=[['a','1'],['b','2']];
var Obj={};
for (i=0; i<data.length; i++) {
    Obj[data[i][0]]=data[i][1]
}
console.log(Obj); // returns  Object { a="1", b="2"}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM