简体   繁体   English

Javascript检查嵌套数组结构中的对象属性

[英]Javascript checking for object properties in a nested array structure

I have two main objects that I am dealing with here. 我在这里处理两个主要对象。 One is called tasks that is an array of objects. 一种称为tasks ,它是一组对象。 The other is called userSelectedRoles which is an array of role ID's. 另一个称为userSelectedRoles ,它是角色ID的数组。

Within my tasks array, there is a property called Roles which is also an array of objects. 在我的任务数组中,有一个名为Roles的属性,它也是一个对象数组。

I am trying to see if the userSelectedRoles exist in any of the tasks, and if not, add them to it. 我正在尝试查看userSelectedRoles存在于任何任务中,如果不存在,请将它们添加到其中。

I created some pseudo I was trying to wrap my head around it. 我创建了一些伪装,试图将其包裹起来。

Example: 例:

var userSelectedRoles = [1, 2, 3],
  tasks = [{
    TaskName: 'Task 1',
    TaskID: 1,
    Roles: [{
      RoleName: 'Role1',
      RoleID: 1
    }, {
      RoleName: 'Role 2',
      RoleID: 2
    }]
  }, {
    TaskName: 'Task 2',
    TaskID: 2,
    Roles: [{
      RoleName: 'Role1',
      RoleID: 1
    }, {
      RoleName: 'Role 3',
      RoleID: 3
    }]
  }]


// Loop over our tasks
for (var t = 0; t < tasks.length; t++) {

  // Loop over the roles
  for (var r = 0; r < tasks[t].Roles.length; r++) {

    // Loop over our user selected roles
    for (var sr = 0; sr < userSelectedRoles.length; sr++) {

      // If this user selected role exists within our roles, continue
      if (tasks[t].Roles[r].RoleID == userSelectedRoles[sr]) {
        // This role exists, no need to do anything
      } else {
        // This user selected role does not exist in our tasks, we need to add it
        tasks[t].Roles.push({
          RoleName: 'Blah',
          RoleID: userSelectedRoles[sr]
        })
      }
    }

  }
}

The above code isn't working, crashed my fiddle so I assume I have a loop wrong somewhere. 上面的代码不起作用,使我的小提琴崩溃了,所以我认为我在某个地方出错了。

Is there an easier way to do this without having to do all the loops perhaps? 有没有更简单的方法可以执行此操作而不必执行所有循环?

The end goal here is that a new role would be added to both tasks. 这里的最终目标是将新角色添加到这两个任务中。 Task 1 = Role 3 & Task 2 = Role 2 . Task 1 = Role 3Task 2 = Role 2

Thoughts? 思考?

You could take a hash table and collect the id, you have. 您可以使用哈希表并收集ID。 Then iterate the userSelectedRoles and if not set, then push the object to Roles . 然后迭代userSelectedRoles ,如果未设置,则将对象推送到Roles

 var userSelectedRoles = [1, 2, 3], tasks = [{ TaskName: 'Task 1', TaskID: 1, Roles: [{ RoleName: 'Role1', RoleID: 1 }, { RoleName: 'Role 2', RoleID: 2 }] }, { TaskName: 'Task 2', TaskID: 2, Roles: [{ RoleName: 'Role1', RoleID: 1 }, { RoleName: 'Role 3', RoleID: 3 }] }]; tasks.forEach(function (task) { var roleIds = Object.create(null); task.Roles.forEach(function (role) { roleIds[role.RoleID] = true; }); userSelectedRoles.forEach(function (id) { if (!roleIds[id]) { task.Roles.push({ RoleName: 'Blah', RoleID: id }); } }); }); console.log(tasks); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

ES6 with Set ES6 Set

 var userSelectedRoles = [1, 2, 3], tasks = [{ TaskName: 'Task 1', TaskID: 1, Roles: [{ RoleName: 'Role1', RoleID: 1 }, { RoleName: 'Role 2', RoleID: 2 }] }, { TaskName: 'Task 2', TaskID: 2, Roles: [{ RoleName: 'Role1', RoleID: 1 }, { RoleName: 'Role 3', RoleID: 3 }] }]; tasks.forEach(function (task) { var ids = new Set(task.Roles.map(({ RoleID }) => RoleID)); userSelectedRoles.forEach(id => ids.has(id) || task.Roles.push({ RoleName: 'Blah', RoleID: id })); }); console.log(tasks); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

How about doing it like this? 这样做怎么样? (I always hated using for-loops, adds additional variables we don't need ie the index) (我一直讨厌使用for循环,添加了我们不需要的其他变量,即索引)

tasks.forEach(task => {
  var roleIds = task.Roles.map(r=>r.RoleID);
  userSelectedRoles.forEach( r => {
   if(roleIds.indexOf(r) === -1){
     task.Roles.push({RoleID: r, RoleName: 'blah'})
   }
  })
})

If you want to know where the mistake is... In the last loop, you add items to the Role. 如果您想知道错误在哪里...在上一个循环中,将项目添加到“角色”。 This means that the loop at 1 level higher will now make 1 more loop. 这意味着高1级的循环现在将增加1个循环。 And this loop will add a new role, which will make it loop one more time, wich will add one more role - I think you got it now :) 并且此循环将添加一个新角色,这将使其再循环一次,至此将再增加一个角色-我想您现在就知道了:)

Solution using this same structure: store the length in a variable before starting the loop, and use that for the number of loops to do. 使用相同结构的解决方案:在开始循环之前将长度存储在变量中,并将其用于要执行的循环数。

for (var t = 0; t < tasks.length; t++) {
  //CHANGED CODE START
  let rolesLength = task[t].Roles.length;
  // Loop over the roles
  for (var r = 0; r < rolesLength ; r++) {
    //CHANGED CODE END
    // Loop over our user selected roles
    for (var sr = 0; sr < userSelectedRoles.length; sr++) {

      // If this user selected role exists within our roles, continue
      if (tasks[t].Roles[r].RoleID == userSelectedRoles[sr]) {
        // This role exists, no need to do anything
      } else {
        // This user selected role does not exist in our tasks, we need to add it
        tasks[t].Roles.push({
          RoleName: 'Blah',
          RoleID: userSelectedRoles[sr]
        })
      }
    }

  }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 使用 Javascript 将数组转换为嵌套的 object 结构 - Convert array to nested object structure using Javascript 通过使用 object - JavaScript 检查另一个嵌套数组来过滤带有对象的嵌套数组 - Filtering a nested array with objects by checking another nested array with object - JavaScript 搜索和更新嵌套在Javascript数组中的对象的属性 - Search & Update properties of an object nested in a Javascript Array JavaScript 中是否有用于检查对象属性的“not in”运算符? - Is there a “not in” operator in JavaScript for checking object properties? 如何通过检查 javascript 中的键 `status` 来更改嵌套数组 object - How to change the nested array object by checking key `status` in javascript 在Javascript中更改对象结构和属性 - Change Object Structure and Properties in Javascript 将嵌套对象数据结构转换为对象数组-JavaScript - Transform Nested Object Data Structure into an Array of Objects- JavaScript 如何从具有 Javascript 的值数组中获取深度嵌套的 object 结构 - How to get deeply nested object structure from array of values with Javascript 过滤具有嵌套结构的JavaScript对象 - Filtering a JavaScript object with nested structure 在 JavaScript 中设置嵌套的 object 属性 - Setting nested object properties in JavaScript
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM