JSON对象中的数组属性通过foreach更新-更新所有键
Array property in JSON object updated via foreach - updates all keys
我有点把头发都拔出来了。我正试图通过foreach循环构建一个JSON对象数组。它工作得很好——除了一处房产。我遇到困难的属性-是一个数组,它在每个循环中都会更新。在第一个循环中,数组将为空。在第一个循环结束时,我添加一个值,为下一个循环做准备。在下一个循环中,创建一个新的JSON对象以添加到数组中。添加数组属性时,它还会更新上一个键。有点奇怪。最终结果是,对于每个数组键(JSON对象),"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++;
}
}
})();
如果您运行-this,我将找到控制台的以下输出。(注意:请注意"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,"type":"user","disabled":null,"exccludedUsers":[5],"count":2,"name":"user2"}]
数组推送后:[{"usersId":57,"type":"user","disabled":"disabled","excludedUsers":[57,58],"count":1,"name":"user1"},{"usersId":58,"type":"user"
您在构建的每个对象中都引用了相同的数组实例。
userSelects[idx].excludedUsers = excludedUsers;
不会将excludedUsers
数组复制到对象的新数组中,而是将对原始数组的引用分配给userSelects[idx].excludedUsers
。
如果您想克隆阵列,可以使用Array.slice()
进行浅层复制:
userSelects[idx].excludedUsers = excludedUsers.slice(0)
- Javascript循环不会自我更新
- 添加文字和评论功能更新Div
- AngularJS:ng之后,重复$scope值未按预期更新
- $rootScope未使用forEach进行更新
- knockout.js获胜't更新我的foreach绑定,尽管更改已注册
- 对可观察数组foreach的更新删除了格式化knockoutjs
- JSON对象中的数组属性通过foreach更新-更新所有键
- Mongo forEach 函数仅在第一行执行更新
- 如何使用Monk在Javascript中的forEach循环中更新文档
- 每10.5秒更新foreach中的项目
- foreach项上的Knockout绑定未更新
- 当使用Knockout's的foreach绑定,do事件会在视图模型更新时自动清理
- 可以't从一个角度内更新全局变量.forEach循环
- Knockoutjs:foreach绑定中的$data没有更新底层元素
- 安全地从异步foreach更新值
- 在forEach angularjs中更新数组
- 如何使用json_encode来更新foreach中的数据
- 如何在不使用foreach的情况下访问动态更新的knockout observableArray中的特定元素
- 更改的 JavaScript 更新 foreach 中的输入值
- 更新mongodb shell上的forEach