Javascript For..在循环中覆盖所有数组值

Javascript For..在循环中覆盖所有数组值,javascript,arrays,node.js,javascript-objects,for-in-loop,Javascript,Arrays,Node.js,Javascript Objects,For In Loop,我正在尝试使用for..in循环遍历名称列表,将它们添加到模板对象“group”,然后将每个完整的对象添加到数组“queryList”。这不起作用,因为每次迭代都会覆盖数组中的所有值。有什么建议可以解释为什么会发生这种情况吗 // BATTERY OBJECT var groupList = [ "LOGIN", "BROWSE", "SEARCH"]; // GROUP OBJECT var group = {dbName: 'CARS', name: '', collectionName:

我正在尝试使用for..in循环遍历名称列表,将它们添加到模板对象“group”,然后将每个完整的对象添加到数组“queryList”。这不起作用,因为每次迭代都会覆盖数组中的所有值。有什么建议可以解释为什么会发生这种情况吗

// BATTERY OBJECT
var groupList = [ "LOGIN", "BROWSE", "SEARCH"];

// GROUP OBJECT
var group = {dbName: 'CARS', name: '', collectionName: 'group'};

// INIT VARS
var groupName = '',
    queryList = [];

// COMPILATION FUNCTION
var buildGroupQueries = function(group){

    // BUILD BATCH OF QUERIES   
    for (var i in groupList){
        groupName = groupList[i];
        group.name = groupName;
        queryList[i] = group;
    }
    console.log(queryList);

}

buildGroupQueries(group);
它应该是这样的:

[
    {"dbName":"CARS","name":"LOGIN","collectionName":"group"},
    {"dbName":"CARS","name":"BROWSE","collectionName":"group"},
    {"dbName":"CARS","name":"SEARCH","collectionName":"group"}
]
相反,我得到的是:

[
    {"dbName":"CARS","name":"SEARCH","collectionName":"group"},
    {"dbName":"CARS","name":"SEARCH","collectionName":"group"},
    {"dbName":"CARS","name":"SEARCH","collectionName":"group"}
]
每次都要修改组对象,但需要修改其副本

将此代码添加到groupList中VarI的行之后{


在每次迭代中,您创建一个新对象,并将主对象中的所有属性复制到该对象。

您正在创建一个引用同一对象的元素数组,因此它们都显示与上次更改时相同的名称,在您的示例中是搜索。 必须将每个元素引用到从要用作模板的元素创建的新对象。 要执行此操作,您可以在其属性上循环或克隆它,如下所示:

// BATTERY OBJECT
var groupList = [ "LOGIN", "BROWSE", "SEARCH"];

// GROUP OBJECT
var group = {dbName: 'CARS', name: '', collectionName: 'group'};

// INIT VARS
var groupName = '',
    queryList = [];

// COMPILATION FUNCTION
var buildGroupQueries = function(group){
    var i, _group;

    // BUILD BATCH OF QUERIES
    for (i in groupList){
        _group        = JSON.parse(JSON.stringify(group));
        groupName     = groupList[i];
        _group.name   = groupName;
        queryList[i]  = _group;
    }
    console.log(queryList);

}

buildGroupQueries(group);

问题在于queryList[i]=group;。看看那个i。你能设置queryList[LOGIN]吗到一个值?或者可能queryList需要初始化为一个字典?我可能只是避免使用in,直到我更好地理解我对这些变量所做的操作。问题根本不在于in语句,问题是组是引用而不是复制。啊,我明白了。这应该是显而易见的哈哈。我正在通过引用传递对象ce,不是值。谢谢你!我接受你的答案。它清晰、简洁并且有完整的示例代码。我应该更注意对象是作为引用而不是值传递的。谢谢Luca!@SC_Chupacabra:谢谢!
// BATTERY OBJECT
var groupList = [ "LOGIN", "BROWSE", "SEARCH"];

// GROUP OBJECT
var group = {dbName: 'CARS', name: '', collectionName: 'group'};

// INIT VARS
var groupName = '',
    queryList = [];

// COMPILATION FUNCTION
var buildGroupQueries = function(group){
    var i, _group;

    // BUILD BATCH OF QUERIES
    for (i in groupList){
        _group        = JSON.parse(JSON.stringify(group));
        groupName     = groupList[i];
        _group.name   = groupName;
        queryList[i]  = _group;
    }
    console.log(queryList);

}

buildGroupQueries(group);