Javascript数组成为对象结构

Aid*_*dal 8 javascript arrays object

我正在经历一个奇怪的行为(可能它并不奇怪,但只是我不理解为什么)与包含一些对象的javascript数组.

由于我不是javascript专家,因此可能会清楚地解释为什么会发生这种情况,我只是不知道.

我有一个在文档中运行的JavaScript.它创建了一个与此类似的对象数组:

var myArray = [{"Id":"guid1","Name":"name1"},{"Id":"guid2","Name":"name2"},...];
Run Code Online (Sandbox Code Playgroud)

如果我在创建它的地方打印出这个数组,就像JSON.stringify(myArray)一样,我得到的是我所期待的:

[{"Id":"guid1","Name":"name1"},{"Id":"guid2","Name":"name2"},...]
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试从子文档访问此数组到此文档(由第一个文档打开的窗口中的文档),则该数组不再是数组.因此,在子文档中执行JSON.stringify(parent.opener.myArray)将导致以下结果:

{"0":{"Id":"guid1","Name":"name1"},"1":{"Id":"guid2","Name":"name2"},...}
Run Code Online (Sandbox Code Playgroud)

这不是我所期待的 - 我期望得到与我在父文档中所做的相同.

任何人都可以向我解释为什么会发生这种情况以及如何解决它,以便从子窗口/文档寻址时数组仍然是一个数组?

PS.如上所述,对象没有添加到数组中,它们是这样添加的:

function objTemp()
{
    this.Id = '';
    this.Name = '';
};

var myArray = [];

var obj = new ObjTemp();
obj.Id = 'guid1';
obj.Name = 'name1';

myArray[myArray.length] = obj;
Run Code Online (Sandbox Code Playgroud)

如果这有任何区别.

任何帮助将非常感谢,既可以解决我的问题,也可以更好地了解正在发生的事情:)

Eli*_*gem 6

最后一行可能是造成问题的原因,你试过更换myArray[myArray.length] = obj;myArray.push(obj);?可能是这样,因为你明确地创建了一个新索引,所以Array变成了一个对象......虽然我只是在这里猜测.你能添加检索的子文档使用的代码myArray吗?

编辑

忽略上述内容,因为它不会有任何区别.虽然,我不想夸耀,但我正在思考正确的思路.我的想法是,通过仅使用专有的数组方法,解释器会将其视为关于类型的线索myArray.问题是:myArray 父文档而言,一个数组,但是由于你将数组从一个文档传递到另一个文档,所以会发生以下情况:

数组是一个对象,包含它自己的原型和方法.通过将其传递给另一个文档,您将整个Array对象(值和原型)作为一个对象传递给子文档.在文档之间传递变量时,您可以有效地创建变量的副本(JavaScript复制var值的唯一时间).由于数组是一个对象,因此它的所有属性(和原型方法/属性)都被复制到该Object对象的"无名"实例中.沿东西线的var copy = new Object(toCopy.constructor(toCopy.valueOf()));正在发生......解决这个问题的最简单的方法,国际海事组织,是严格阵列withing父上下文,因为在那里,解释都知道它是一个数组:

//parent document
function getTheArray(){ return JSON.stringify(myArray);}
//child document:
myArray = JSON.parse(parent.getTheArray());
Run Code Online (Sandbox Code Playgroud)

在此示例中,var在仍然视为myArray真正JavaScript数组的上下文中进行了字符串化,因此生成的字符串将是您所期望的.在将JSON编码的字符串从一个文档传递到另一个文档时,它将保持不变,因此JSON.parse()它将为您提供myArray变量的精确副本.

请注意,这只是黑暗中的另一种狂野刺杀,但我现在已经多考虑了一下.如果我对此错了,请随意纠正我...我总是乐于学习.如果事实证明这是真的,那么请告诉我,因为这无疑会迟早会给我带来陷阱