可以在forEach()中使用splice()吗? Vue突变

时间:2018-11-03 20:08:24

标签: javascript arrays vue.js vuex

您好,也许有更好的方法,但是我想用响应数据替换与某个索引匹配的对象。我目前正在尝试在forEach()中使用splice(),但是它不能替换对象,只会删除它们。

我正在使用Vue.js

这是我的变异

updateCheckedEngagements(state, checkedEngagements) {
  checkedEngagements.forEach((engagement) => {
  const index = state.engagements.findIndex((e) => e.id === engagement.id);
    state.engagements.splice(index, checkedEngagements.length, {
     'id': checkedEngagements.id,
     'client_id': checkedEngagements.client_id,
     'workflow_id': checkedEngagements.workflow_id,
     'return_type': checkedEngagements.return_type,
     'year': checkedEngagements.year,
     'assigned_to': checkedEngagements.assigned_to,
     'status': checkedEngagements.status,
     'done': false
     })
   });
  },

1 个答案:

答案 0 :(得分:1)

无需使用splice(),您只需将特定的数组元素重新分配给新的对象值即可。

id数组上也没有像checkedEngagements这样的属性,您需要特定的engagement对象实例

checkedEngagements.forEach((engagement) => {
  const index = state.engagements.findIndex((e) => e.id === engagement.id);
  // TODO: make sure index isn't -1 and return if it is

  // reassign that index to new object value
  state.engagements[index] = {
    'id': engagement.id,
    'client_id': engagement.client_id,
    'workflow_id': engagement.workflow_id,
    'return_type': engagement.return_type,
    'year': engagement.year,
    'assigned_to': engagement.assigned_to,
    'status': engagement.status,
    'done': false
  }
})

另一种无需手动写入所有属性即可完成此操作的方法是使用Object.assign()

checkedEngagements.forEach((engagement) => {
  const o = state.engagements.find((e) => e.id === engagement.id);
  Object.assign(o, engagement, {done:false}) 
})