1

我正在为 safari 浏览器开发扩展。我想将当前活动的选项卡对象作为键存储在数组中。如何将多个选项卡对象存储在数组中。

我写了以下代码。

**第一种情况:

var obj = {};

obj1=new Object();
obj2=new Object();
obj3=new Object();

obj['cTab_'+obj1] = "This is object1";
obj['cTab_'+obj2] = "This is object2";
obj['cTab_'+obj3] = "This is object3";**

问题是我得到了第三个对象值。如何获取所有对象值。

**第二种情况:

var arr = new Array();

cTabObj1 = new Object();
arr[cTabObj1] = 'This is cTabObj1 Value';

cTabObj2 = new Object();
arr[cTabObj2] = 'This is cTabObj2 Value';

cTabObj3 = new Object();
arr[cTabObj3] = 'This is cTabObj3 Value';

alert("arr[cTabObj1]    :" + arr[cTabObj1] + " arr[cTabObj2]    :" + arr[cTabObj2] + " arr[cTabObj3]    :" + arr[cTabObj3]);**

在这里,我也得到所有三个对象的“这是 cTabObj3 值”

提前致谢。

4

4 回答 4

1

我想将当前活动选项卡对象存储在数组中作为键

你不能那样做。键是字符串。它们始终是字符串。

如果您查看数组,您会发现任何对象都被转换为,"[object Object]"因此您基本上插入相同的键 3 次。

使用console.log(arr)console.dir(arr)与 firebug 或 chrome/opera/safari 一起使用

你想要的是一个 ES6 WeakMap

只有 Firefox6 实现了 WeakMap

于 2011-08-01T07:10:21.197 回答
1

键必须是字符串。

尝试toString在您的对象上实现该方法,以便它为每个对象返回一个唯一标识符。然后'cTab_' + obj将是一个唯一的字符串。

于 2011-08-01T07:10:59.133 回答
0

您的第一个方案是要走的路,只是您已为要存储的每个对象分配了相同的下标键obj。当您对对象属性键使用字符串以外的任何内容时,该值已toString()在内部调用它,因此

obj['cTab_'+obj1] = "This is object1";
obj['cTab_'+obj2] = "This is object2";
obj['cTab_'+obj3] = "This is object3";

都将具有相同的键cTab_[object Object]

您需要的是区分键。由于每个对象在被调用时都会返回“[object Object]” toString(),因此您也可以从属性键中删除该对象,因为它是多余的,例如

var obj = {};
obj['cTab1'] = "This is object1";
obj['cTab2'] = "This is object2";
obj['cTab3'] = "This is object3";

或者更简洁

var obj = {
    cTab1 : "This is object1",
    cTab2 : "This is object2",
    cTab3 : "This is object3"
};

第二种方法不可行的原因是您正在尝试使用 JavaScript 数组,例如关联数组,但事实并非如此;起初它似乎可以工作,但随后您会发现一些非常奇怪的行为,例如arr.length不将它们视为数组中的项目等。有关更多详细信息,请阅读链接文章。您想为此使用Object( {})。

于 2011-08-01T07:15:18.910 回答
0

你应该这样存储

cTabObj1 = new Object();
arr["cTabObj1"] = cTabObj1;
于 2011-08-01T07:16:56.507 回答