2017-12-14 16 views
0

データベースから読み込まれたデータオブジェクトがあります。ユーザーはページ上のオプションを選択することができ、初期オブジェクトに存在しないオプションのそれぞれについて、それらを作成する必要があります。オブジェクト上のJavascriptループと配列から欠落したオブジェクトを作成する

私はここで何をしようとしているのか疑問符を書きましたが、メモリ問題が発生してクラッシュしました。

ここでの目標は、それぞれtask>Rolesの配列を繰り返して、作成する必要のある欠けているオブジェクトがあるかどうかを確認することです。作成する必要のあるオブジェクトはselectedRolesです。

望ましい結果:最初のタスクで

、それはその現在の空のように3つのロールを作成する必要があります。 2番目のタスクでは、IDが2のロールがすでに存在するため、ロール1とロール3が作成されます。

var tasks = [{ 
    "User": { 
    "FirstName": "Joe", 
    "LastName": "Dirt", 
    "selected": false, 
    "marked": false 
    }, 
    "Tool": { 
    "id": 31, 
    "text": "Admin", 
    "ToolID": "31", 
    "ToolName": "Admin", 
    "ToolSuite": "Enterprise Product" 
    }, 
    "Roles": [] 
}, { 
    "User": { 
    "FirstName": "Bart", 
    "LastName": "Simpson", 
    "selected": false, 
    "marked": false 
    }, 
    "Tool": { 
    "id": 35, 
    "text": "Wordpress", 
    "ToolID": "35", 
    "ToolName": "Wordpress", 
    "ToolSuite": "Enterprise Product" 
    }, 
    "Roles": [{ 
    RoleName: 'Role 2', 
    Role: 2, 
    RoleID: 2 
    }] 
}]; 

// New selected roles from list 
var selectedRoles = [1, 2, 3]; 

//////////////////////////////////////////////////////////////////////// 

/* 
    Loop over the configured tasks and 
    if there is not an existing role 
    matching a role id from "SelectedRoles", 
    create a new role within that task. 
*/ 

// Loop over the tasks 
tasks.forEach((task) => { 
    // If we have roles, loop over them 
    if (task.Roles.length) { 
    for (let i = 0; i < task.Roles.length; i++) { 
      // If this roleID does not exist in our selectedRoles, create the task 
     if(selectedRoles.indexOf(task.Roles[i].RoleID) >= 0){ 
     // Create this role and add it to our task 
     task.Roles.push(createRole('Role ' + task.Roles[i].RoleID, task.Roles[i].RoleID, task.Roles[i].RoleID)); 
     } 
    } 
    } 
}); 

console.log(tasks) 

function createRole(RoleName, RoleID, Role){ 
    return { 
    RoleName: RoleName, 
    RoleID: RoleID, 
    Role: Role 
    } 
} 

これを処理するためのよりクリーンな(そして実際的な)方法に関する考えはありますか?ここで

答えて

1

var tasks = [{ 
 
    "User": { 
 
    "FirstName": "Joe", 
 
    "LastName": "Dirt", 
 
    "selected": false, 
 
    "marked": false 
 
    }, 
 
    "Tool": { 
 
    "id": 31, 
 
    "text": "Admin", 
 
    "ToolID": "31", 
 
    "ToolName": "Admin", 
 
    "ToolSuite": "Enterprise Product" 
 
    }, 
 
    "Roles": [] 
 
}, { 
 
    "User": { 
 
    "FirstName": "Bart", 
 
    "LastName": "Simpson", 
 
    "selected": false, 
 
    "marked": false 
 
    }, 
 
    "Tool": { 
 
    "id": 35, 
 
    "text": "Wordpress", 
 
    "ToolID": "35", 
 
    "ToolName": "Wordpress", 
 
    "ToolSuite": "Enterprise Product" 
 
    }, 
 
    "Roles": [{ 
 
    RoleName: 'Role 2', 
 
    Role: 2, 
 
    RoleID: 2 
 
    }] 
 
}]; 
 

 
// New selected roles from list 
 
var selectedRoles = [1, 2, 3]; 
 

 
//////////////////////////////////////////////////////////////////////// 
 

 
/* 
 
    Loop over the configured tasks and 
 
    if there is not an existing role 
 
    matching a role id from "SelectedRoles", 
 
    create a new role within that task. 
 
*/ 
 
tasks.forEach((task) => { 
 
    if(task.Roles.length == 0){ 
 
     for(var i = 0; i < selectedRoles.length; i++){ 
 
     task.Roles.push(createRole('Role ' + selectedRoles[i], selectedRoles[i], selectedRoles[i])); 
 
     } 
 
    } 
 
    else{ 
 
     var concatRoleArr = []; 
 
     var roleIdArr = []; 
 
     for(var i = 0; i < task.Roles.length; i++){ 
 
     roleIdArr.push(task.Roles[i].RoleID); 
 
     } 
 
     for(var i = 0; i < selectedRoles.length; i++){ 
 
     var roleIndex = roleIdArr.indexOf(selectedRoles[i]); 
 
     if(roleIndex < 0){ 
 
      concatRoleArr.push(createRole('Role ' + selectedRoles[i], selectedRoles[i], selectedRoles[i])); 
 
     } 
 
     } 
 
     task.Roles = task.Roles.concat(concatRoleArr); 
 
    } 
 
}); 
 

 
console.log(tasks); 
 

 

 
function createRole(RoleName, RoleID, Role){ 
 
    return { 
 
    RoleName: RoleName, 
 
    RoleID: RoleID, 
 
    Role: Role 
 
    } 
 
}

あなたが後にしているものに、あなたの更新されたコードです。私たちはあなたのループを変更しました。すべての役割があるかどうかを確認することから始めます。そうでない場合は、selectedRolesをループし、それぞれをロールに追加します。

タスクに既存のロールがある場合は、新しい配列(concatRoleArr)を作成し、すべてのroleIdを新しい配列に集めてから、selectedRolesを再度ループします。既存のロールIDの配列に現在選択されているロールが含まれていない場合(indexOfが-1)、それを新しいconcatRoleArrに追加します。そうでない場合は、continueを実行します。作業が完了したら、concatRoleArrを使用してtask.Roles配列を連結します。

元のコードに無限ループがあるため、メモリの問題が発生していました。 task.Rolesにロールを追加するので、ループを続けるとtask.Rolesの最後に到達することがなくなります。とにかく既存のロールをループしていただけなので、あなたのロールが常に行った配列内にEXISTSが存在する場合、> = 0でindexOfをチェックするとtrueになります。 <をチェックすると、-1が返されるため、存在しないかどうかチェックされます。

+0

ありがとうございました!デモが動作するように見える、統合は同じでなければならない:) - それを感謝する! – SBB

関連する問題