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 循环覆盖所有数组值的主要内容,如果未能解决你的问题,请参考以下文章