将javascript对象推送到数组

时间:2011-12-05 22:52:16

标签: javascript

我有一个循环遍历MyArrayOfObjects对象数组,然后将对象推送到这样的新数组:

var NewArray = new Array();

for (i = 0; i < MyArrayOfObjects.length; i++) {

  TempObject = null;
  TempObject = new Object();

 // I have logic that copies certain properties but not others
 // but overall it looks like this:

  TempObject.prop1 = MyArrayOfObjects[i].prop1;
  TempObject.prop2 = MyArrayOfObjects[i].prop2;

  NewArray.push(TempObject);
}

当我遍历MyArrayOfObjects时,我清除TempObject并每次创建一个新的。 NewArray是否包含我正在复制的对象,或者只是对复制的对象的引用,然后在循环迭代时被删除?

感谢。

3 个答案:

答案 0 :(得分:3)

它包含对象本身的引用。

此代码显示了操作中的概念(注意在将其推入数组后更改对象也会更改数组中的对象):

var ray = new Array();
var obj = { foo: 123 };

ray.push(obj);

obj.foo = 321;
alert(ray[0].foo);

答案 1 :(得分:2)

> var NewArray = new Array();

通常认为使用数组文字来创建数组会更好。以大写字母开头的变量名称是常规,用于构造函数。在变量名称的开头使用“new”可以很容易地变成“new Array”,并且名称应该反映其目的,所以类似下面的内容可能会更好:

var objectArray = [];

> for (i = 0; i < MyArrayOfObjects.length; i++) {

您应该始终声明变量,尤其是计数器,因为未声明的变量在首次分配值时会成为全局对象(实际上是全局变量)的属性。此外,存储数组的长度比在每次迭代中获取它更好:

for (var i = 0, iLen = MyArrayOfObjects.length; i < iLen; i++) {

>   TempObject = null;
>   TempObject = new Object();

再次声明变量。如果您要在之后立即分配其他值,则分配 null 的值没有任何用处。只做第二个任务(并使用文字):

  var TempObject = {};

>  // I have logic that copies certain properties but not others
>  // but overall it looks like this:
> 
>   TempObject.prop1 = MyArrayOfObjects[i].prop1;
>   TempObject.prop2 = MyArrayOfObjects[i].prop2;
> 
>   NewArray.push(TempObject);

此时, TempObject NewArray [NewArray.length - 1] 都引用同一个对象。

> }
  

当我遍历MyArrayOfObjects时,我清除TempObject并创建   每次一个新的。

无需“清除”对象,只需为变量赋值即可。在javascript中,所有变量都有一个可能是基元的值(例如字符串,数字)或对象的引用(例如,对象,数组,数字,字符串)

  

NewArray是否包含我所拥有的对象   复制或只是对复制的对象的引用然后变为   在循环迭代时删除?

它包含对每次迭代时创建的新对象的引用。

由于变量保存对象的引用,因此为变量赋值不会对对象执行任何操作。当一个对象不再被任何变量或对象属性引用时,它可用于垃圾收集,并且可以在以后运行垃圾收集时自动删除。

答案 2 :(得分:0)

使用map或其jquery counterpart可能是一种更为惯用的方式。例如:

var oldArray = [
    { prop1: 1, prop2: 10 },
    { prop1: 2, prop2: 20 },
    { prop1: 3, prop2: 30 }
]

var newArray = $.map(oldArray, function(oldObj) {
    return { newProp: oldObj.prop1 }
})

console.log(newArray)