使用对象的副本创建数组(Javascript)

Creating an array with copy of object (Javascript)

本文关键字:数组 Javascript 创建 副本 对象      更新时间:2024-01-17

我正在尝试编写一个"通用"数组填充器,用给定的对象填充数组。我用javascript模拟了一个类,现在我想写一个函数,用该类的类型填充数组

function fillArray(theArrayToFill,amount,theObject) {
for ( var i = 0; i != amount; ++i ) 
    {theArrayToFill.push(theObject);}
}

但是填充数组(数组,3,新敌人(0,0));用对对象"敌人"的引用填充数组,这不是我想要的,我想要一个精确的副本,但当我改变对象0时,对象2可能不会改变。

请帮助感谢

我建议您向对象添加一个克隆方法。clone方法应该创建一个新对象,并通过复制当前对象来设置其值,然后该方法返回这个新对象。

示例:

function clone(obj)
{
    var newObj = new YourObject();
    newObj.setName(obj.getName());
    //Do this for every properties
    return newObj;
}

如果您使用Underscore,它提供了一个克隆助手函数。

function fillArray(theArrayToFill,amount,theObject) {
for ( var i = 0; i != amount; ++i ) 
    {theArrayToFill.push(_.clone(theObject));}
}

由于您已经有了构造函数,下面是如何使用它:

function fillArray(theArrayToFill,amount,ctor) {
  for ( var i = 0; i != amount; ++i ) {
    theArrayToFill.push(new ctor(0,0));
  }
}
// usage:
fillArray(theArray,3,Enemy);

按照最初调用fillArray方法的方式,创建了一个对象(紧接在调用函数之前),并将其作为参数传递给fillArray。然后,该方法继续在数组中填充对该对象的引用,这样数组中的每个项都会指向同一个对象。

编辑:如果您想将不同的参数传递给构造函数,则不会想到简单的解决方案。这里有一个可能足够你使用的技巧:

function fillArray(theArrayToFill,amount,ctor) {
  for ( var i = 0; i != amount; ++i ) {
    theArrayToFill.push(new ctor(arguments[3], arguments[4], arguments[5],
        arguments[6], arguments[7], arguments[8], arguments[9], arguments[10], 
        arguments[11], arguments[12], arguments[13], arguments[14]));
  }
}
// usage:
fillArray(theArray,3,Enemy,0,0);
fillArray(theArray,3,Friend,1,2,3,4,5,6,7,8);

显然,这只适用于参数少于12个的构造函数,并且基于构造函数中使用的参数的一些检查也会失败,但它可以完成任务。

附言:我不建议你用这种方法。看起来克隆方法更适合您的目的。

您可以使用Object.create()

function fillArray(theArrayToFill,amount,theObject) {
    for ( var i = 0; i != amount; ++i ) {
        theArrayToFill.push(Object.create(theObject));
    }
}

或者,如果你想返回新的数组填充默认值,你可以使用下一个代码

function fillArray(amount,theObject) {
    return Array.apply(null,Array(amount)).map(function(_){return Object.create(theObject);});
}