javascript - 如何迭代两个对象并根据 JS 中的另一个更新一个值?

标签 javascript

如果该对象的键与第二个对象的键匹配,我如何填充该对象的值?

要填充的对象

const task = {
      name: '',
      description: '',
      status: '',
      priority: '',
      due_date: '',
      due_date_time: '',
      parent: '',
      time_estimate: '',
      start_date: '',
      start_date_time: '',
      assignees: {},
      archived: ''
  }

原始对象

const taskData = { 
  id: '476ky1',
  custom_id: null,
  name: 'Reunião com o novo Gerente de Vendas - Airton',
  text_content: null,
  description: null,
  status: 
   { id: 'p3203621_11svBhbO',
     status: 'to do',
     color: '#d3d3d3',
     orderindex: 0,
     type: 'open' },
  orderindex: '1.16183176837360000000000000000000',
  date_created: '1618317683783',
  date_updated: '1618317683783',
  date_closed: null,
  archived: false,
  creator: 
   { id: 3184709,
     username: 'Michael Jackson',
     color: '#455963',
     email: 'email@gmail.com',
     profilePicture: null },
  assignees: 
   [ { id: 3184709,
       username: 'Antonio Santos',
       color: '#455963',
       initials: 'AS',
       email: 'santosonit@gmail.com',
       profilePicture: null } ],
  watchers: 
   [ { id: 3184709,
       username: 'Antonio Santos',
       color: '#455963',
       initials: 'AS',
       email: 'santosonit@gmail.com',
       profilePicture: null } ],
  checklists: [],
  tags: [],
  parent: null,
  priority: null,
  due_date: null,
  start_date: null,
  points: null,
  time_estimate: null,
  time_spent: 0,
  custom_fields: [],
  dependencies: [],
  linked_tasks: [],
  team_id: '3101702',
  url: 'https://app.clickup.com/t/476ky1',
  permission_level: 'create',
  list: { id: '13700791', name: 'List', access: true },
  project: { id: '7328469', name: 'hidden', hidden: true, access: true },
  folder: { id: '7328469', name: 'hidden', hidden: true, access: true },
  space: { id: '3203621' },
  attachments: [] 
}

现在,请不要谴责我,因为我才刚刚开始处理对象,我确信有很多方法可以做到这一点,但是 for loop 是一种方法吗?看着?它不会修改 task 对象,对吧。那么我将如何返回填充的task呢?

for(let a = 0; a < task.length; a++){
  for (let n = 0; n < data.length; a++){
    if(Object.keys(task) == Object.keys(data)){
      Object.values(task) = Object.values(data)
    }
  }
}

感谢您的帮助!

最佳答案

您已经在 task 中很好地定义了您想要的键,因此我们可以简单地使用 for (let k in task) 遍历它们。如果 taskData[k] 没有值,此解决方案将恢复为使用空字符串。 (滚动到代码块的底部以查看解决方案!)

const taskData = { 
  id: '476ky1',
  custom_id: null,
  name: 'Reunião com o novo Gerente de Vendas - Airton',
  text_content: null,
  description: null,
  status: 
   { id: 'p3203621_11svBhbO',
     status: 'to do',
     color: '#d3d3d3',
     orderindex: 0,
     type: 'open' },
  orderindex: '1.16183176837360000000000000000000',
  date_created: '1618317683783',
  date_updated: '1618317683783',
  date_closed: null,
  archived: false,
  creator: 
   { id: 3184709,
     username: 'Michael Jackson',
     color: '#455963',
     email: 'email@gmail.com',
     profilePicture: null },
  assignees: 
   [ { id: 3184709,
       username: 'Antonio Santos',
       color: '#455963',
       initials: 'AS',
       email: 'santosonit@gmail.com',
       profilePicture: null } ],
  watchers: 
   [ { id: 3184709,
       username: 'Antonio Santos',
       color: '#455963',
       initials: 'AS',
       email: 'santosonit@gmail.com',
       profilePicture: null } ],
  checklists: [],
  tags: [],
  parent: null,
  priority: null,
  due_date: null,
  start_date: null,
  points: null,
  time_estimate: null,
  time_spent: 0,
  custom_fields: [],
  dependencies: [],
  linked_tasks: [],
  team_id: '3101702',
  url: 'https://app.clickup.com/t/476ky1',
  permission_level: 'create',
  list: { id: '13700791', name: 'List', access: true },
  project: { id: '7328469', name: 'hidden', hidden: true, access: true },
  folder: { id: '7328469', name: 'hidden', hidden: true, access: true },
  space: { id: '3203621' },
  attachments: [] 
};

const task = {
    name: '',
    description: '',
    status: '',
    priority: '',
    due_date: '',
    due_date_time: '',
    parent: '',
    time_estimate: '',
    start_date: '',
    start_date_time: '',
    assignees: {},
    archived: ''
};

// Here's the solution!
for (let k in task) task[k] = taskData[k] ?? '';

console.log({ task });

请注意,如果您确定 taskData 包含 task 中键的超集,您可以简单地使用:

for (let k in task) task[k] = taskData[k];

关于javascript - 如何迭代两个对象并根据 JS 中的另一个更新一个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74001211/

相关文章:

javascript - Vuejs 列表循环 - 根据每个子项的属性添加类

javascript - 如何在 Javascript 中设置全局变量?

javascript - 调用render方法时ReactJS是 "clever"吗?

javascript - 在 jQuery if 语句中使用 &&

javascript - 查找 JavaScript 数组中最大值的键

javascript - 连续两次使用 array.pop() 获取倒数第二个元素

javascript - 来自具有父关系的单个项目数组的 Ractive.js 嵌套列表

javascript - 高分辨率 HTML5 Canvas 屏幕截图

javascript - Mapbox 地理编码

javascript - 为什么在 Chrome Dev Console 上出现 "Uncaught ReferenceError: $ is not defined"错误?