[英]Array property in JSON object updated via foreach - updates all keys
我有点把头发拉出来。 我试图通过foreach循环构建一个JSON对象数组。 它很棒 - 除了一个属性。 我遇到困难的属性是在每个循环期间更新的数组。 在第一个循环期间,数组将为空。 在第一个循环结束时,我添加一个值来为下一个循环做准备。 在下一个循环期间 - 创建一个新的JSON对象以添加到数组中。 当我添加数组属性时,它还会更新以前的键。 有点奇怪。 最终结果是,对于每个数组键(JSON Object),'excludedUsers'数组是相同的。
( function () {
// Pre-populate User Permissions
var userPermissions = $('.js-user-permissions').val();
var numberOfSelects = 1;
var count = 1;
var arraySize;
var viewHtml = '';
var userSelects = [];
var excludedUsers = [];
if(userPermissions) {
userPermissions = jQuery.parseJSON(userPermissions);
// An array of JSON like:
// [{ usersId=57, type="user"}, { usersId=58, type="user"}]
arraySize = userPermissions.length;
for(var idx = 0; idx < userPermissions.length; idx++) {
userSelects[idx] = {};
console.log("Loop #" + idx);
// Set default value of select element
userSelects[idx].usersId = userPermissions[idx].usersId;
userSelects[idx].type = userPermissions[idx].type;
userSelects[idx].disabled = arraySize == count ? null : 'disabled';
userSelects[idx].excludedUsers = excludedUsers;
userSelects[idx].count = numberOfSelects;
userSelects[idx].name = "user" + numberOfSelects;
numberOfSelects++;
console.log("Before Array Push: " + JSON.stringify(userSelects));
excludedUsers[idx] = userPermissions[idx].usersId;
console.log("After Array Push: " + JSON.stringify(userSelects));
count++;
}
}
})();
如果你运行 - 这,我发现以下输出到控制台。 (注意:观看酒店'excludedUsers').......
循环#0
阵列推送之前:[{“usersId”:57,“type”:“user”,“disabled”:“disabled”,“excludedUsers”:[],“count”:1,“name”:“user1”}]
阵列推送后:[{“usersId”:57,“type”:“user”,“disabled”:“disabled”,“excludedUsers”:[57],“count”:1,“name”:“user1”} ]
循环#1
阵列推送之前:[{“usersId”:57,“type”:“user”,“disabled”:“disabled”,“excludedUsers”:[57],“count”:1,“name”:“user1”} ,{ “usersId”:58, “类型”: “用户”, “无效”:NULL, “excludedUsers”:[57], “计数”:2 “名称”: “用户2”}]
阵列推送后:[{“usersId”:57,“type”:“user”,“disabled”:“disabled”,“excludedUsers”:[57,58],“count”:1,“name”:“user1 “},{” usersId “:58,” 类型 “:” 用户”, “无效”:NULL, “excludedUsers”:[57,58], “计数”:2 “名称”: “用户2”}]
您正在构建的每个对象中引用相同的数组实例。
userSelects[idx].excludedUsers = excludedUsers;
不会将excludedUsers
数组复制到该对象的新数组中,它会将对原始数组的引用分配给userSelects[idx].excludedUsers
。
如果要克隆数组,可以使用Array.slice()
执行浅表复制:
userSelects[idx].excludedUsers = excludedUsers.slice(0)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.