二级数组中的对象。导致意外的令牌[
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 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"}
你不能这样做,它不是对象文字的有效语法:
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 };
换句话说,您创建的对象具有属性 t1
和 t3
,而不是 a
和 b
。
您必须创建一个空对象并使用括号表示法填充它 []
:
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={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 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"}
你不能这样做,它不是对象文字的有效语法:
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 };
换句话说,您创建的对象具有属性 t1
和 t3
,而不是 a
和 b
。
您必须创建一个空对象并使用括号表示法填充它 []
:
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));