通过foreach更新JSON对象中的Array属性 - 更新所有键

时间:2015-02-18 04:11:26

标签: javascript arrays json foreach

我有点把头发拉出来。我试图通过foreach循环构建一个JSON对象数组。它很棒 - 除了一个属性。我遇到困难的属性是在每个循环期间更新的数组。在第一个循环期间,数组将为空。在第一个循环结束时,我添加一个值来为下一个循环做准备。在下一个循环期间 - 创建一个新的JSON对象以添加到数组中。当我添加数组属性时,它还会更新以前的键。有点奇怪。最终结果是,每个数组键(JSON对象),排除的用户'数组是一样的。

    ( 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++;

        }

    }

})();

如果你跑了 - 这个,我发现以下输出到控制台。 (注意:观看酒店&#39; excludedUsers&#39;).......

循环#0

阵列推送之前:[{&#34; usersId&#34;:57,&#34; type&#34;:&#34; user&#34;,&#34; disabled&#34;:&#34 ;禁用&#34;&#34; excludedUsers&#34;:[],&#34;计数&#34;:1,&#34;名称&#34;:&#34;用户1&#34;}]

数组推送后:[{&#34; usersId&#34;:57,&#34; type&#34;:&#34; user&#34;,&#34; disabled&#34;:&#34 ;禁用&#34;&#34; excludedUsers&#34;:[57],&#34;计数&#34;:1,&#34;名称&#34;:&#34;用户1&#34;}] < / p>

循环#1

阵列推送之前:[{&#34; usersId&#34;:57,&#34; type&#34;:&#34; user&#34;,&#34; disabled&#34;:&#34 ;禁用&#34;&#34; excludedUsers&#34;:[57],&#34;计数&#34;:1,&#34;名称&#34;:&#34;用户1&#34;},{ &#34; usersId&#34;:58,&#34;类型&#34;:&#34;使用者&#34;&#34;禁用&#34;:空,&#34; excludedUsers&#34;:[ 57],&#34;计数&#34;:2&#34;名称&#34;:&#34;用户2&#34;}]

数组推送后:[{&#34; usersId&#34;:57,&#34; type&#34;:&#34; user&#34;,&#34; disabled&#34;:&#34 ;禁用&#34;&#34; excludedUsers&#34;:[57,58],&#34;计数&#34;:1,&#34;名称&#34;:&#34;用户1&#34;} ,{&#34; usersId&#34;:58,&#34;类型&#34;:&#34;使用者&#34;&#34;禁用&#34;:空,&#34; excludedUsers&#34; :[57,58],&#34;计数&#34;:2&#34;名称&#34;:&#34;用户2&#34;}]

1 个答案:

答案 0 :(得分:0)

您正在构建的每个对象中引用相同的数组实例。

userSelects[idx].excludedUsers = excludedUsers;不会将excludedUsers数组复制到该对象的新数组中,它会将对原始数组的引用分配给userSelects[idx].excludedUsers

如果要克隆阵列,可以使用Array.slice()进行浅层复制:

userSelects[idx].excludedUsers = excludedUsers.slice(0)