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

时间:2013-12-02 16:41:54

标签: javascript arrays object copy fill

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

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

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

请帮助 感谢

4 个答案:

答案 0 :(得分:1)

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

示例:

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

    return newObj;
}

答案 1 :(得分:0)

如果您使用的是Underscore,它会提供克隆辅助功能。

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

答案 2 :(得分:0)

由于您已经拥有构造函数,因此以下是使用它的方法:

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方法。然后该方法使用对该对象的引用来填充数组,因此数组中的每个项目确实指向同一个对象。

编辑: 如果要将不同的参数传递给构造函数,则不会想到任何简单的解决方案。这是一个可能足以满足您目的的hacky:

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的构造函数,并且构造函数中基于已使用参数的某些检查也会失败,但它可以完成工作。

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

答案 3 :(得分:0)

您可以使用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);});
}