两级数组中的对象.导致意外令牌 [.

object from two-level array. causes Unexpected token [

本文关键字:对象 意外 令牌 两级 数组      更新时间:2023-09-26
var data=[['a','1'],['b','2']];

这应该很容易制作成一个对象

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

而是创建语法错误:意外的令牌 [

为什么当我尝试以这种方式构造对象时,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";

在第一种情况下,您将名为 B on obj 的属性设置为字符串 "foo" 。在第二种情况下,您将属性t1 obj设置为"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));

i我认为这对于您想要做的事情要简单得多。

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"}