Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/448.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用javascript在数组中存储对象_Javascript_Safari Extension - Fatal编程技术网

如何使用javascript在数组中存储对象

如何使用javascript在数组中存储对象,javascript,safari-extension,Javascript,Safari Extension,我正在为safari browswer开发Extennions。我想将当前活动选项卡对象作为键存储在数组中。如何在数组中存储多个选项卡对象 我编写了以下代码 **第一种情况: 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_'

我正在为safari browswer开发Extennions。我想将当前活动选项卡对象作为键存储在数组中。如何在数组中存储多个选项卡对象

我编写了以下代码

**第一种情况:

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]);**
问题是我得到了第三个对象值。如何获取所有对象值

**第二种情况:

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值”

提前谢谢

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

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

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

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

您需要的是ES6
WeakMap


只有Firefox6实现

键必须是字符串


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

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

obj['cTab_'+obj1] = "This is object1";
obj['cTab_'+obj2] = "This is object2";
obj['cTab_'+obj3] = "This is object3";
都将具有相同的键
cTab_u0;[object]

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

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

第二条路之所以不是,是因为你是,而他们不是;一开始它可能会起作用,但随后您会发现一些非常奇怪的行为,例如
arr.length
不将它们计为数组中的项目等。有关更多详细信息,请阅读链接文章。您希望为此使用
对象(
{}

cTabObj1 = new Object();
arr["cTabObj1"] = cTabObj1;

发生第一个问题是因为所有对象都具有相同的字符串表示形式。然而,我最初的建议是你的第二种情况;既然这样做行不通,这就成了一个有趣的问题。重复问题,请参见@Morre为对象定义自己的
toString
,这是一个聪明的技巧。没有想到我总是对所有对象都这样做(toString)——这对调试非常好,在Firebug中输出更好;-)