For..In 循环覆盖所有数组值

Posted

技术标签:

【中文标题】For..In 循环覆盖所有数组值【英文标题】:For..In Loop Overwriting ALL Array Values 【发布时间】:2014-11-25 17:08:18 【问题描述】:

我正在尝试使用 for..in 循环遍历名称列表,将它们添加到模板对象(“组”),然后将每个完整对象添加到数组(“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"
]

【问题讨论】:

问题出在queryList[i] = group;。看看那个i。您可以将queryList["LOGIN"] 设置为一个值吗?或者也许 queryList 需要初始化为字典?我可能会避免使用in,直到我更好地了解我正在使用这些变量做什么。 问题根本不在于in语句,问题在于group是一个引用,没有被复制。 【参考方案1】:

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

// 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);

【讨论】:

我接受你的回答。它清晰、简洁并具有完整的示例代码。我应该更加注意对象是作为引用而不是值传递的。谢谢卢卡! @SC_Chupacabra:谢谢!【参考方案2】:

你每次都修改group对象,但你需要修改它的副本。

for (var i in groupList) 行之后添加此代码

var _group = ;
for (var j in group) _group[j] = group[j]; 

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

【讨论】:

啊,我明白了。这应该很明显了哈哈。我通过引用而不是值传递对象。谢谢大佬!

以上是关于For..In 循环覆盖所有数组值的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript中的for in 循环

angularjs怎么遍历每个对象的属性的值

for in for of区别

for循环,for…in循环,forEach循环的区别

for-in和for 循环 的区别

对象④for in 循环