Javascript 在vueJs中修改Apollo GraphQL获取的属性

Javascript 在vueJs中修改Apollo GraphQL获取的属性,javascript,vue.js,graphql,apollo,Javascript,Vue.js,Graphql,Apollo,我希望使用javascript矩库格式化通过Apollo GraphQL获取的日期。我在客户端使用VueJS Apollo进行graphQL查询,如下所示: import { ALL_EVENTS } from '../constants/graphql.js' import Event from './Event' import moment from 'moment' export default { name: 'EventList', data: () => ({

我希望使用javascript矩库格式化通过Apollo GraphQL获取的日期。我在客户端使用VueJS Apollo进行graphQL查询,如下所示:

import { ALL_EVENTS } from '../constants/graphql.js'
import Event from './Event'
import moment from 'moment'

export default {
  name: 'EventList',
  data: () => ({
      events: [],
      loading: 0
    }),
  apollo: {
    events: ALL_EVENTS
  },
  components: {
    Event
  },
apollo中间件返回包含id、名称、起始日期(UTC格式字符串)的对象列表 ,以及endDate(也是UTC格式的字符串)属性,以及apollo为其使用而添加的其他属性

每当我尝试使用Apollo的对象列表在VueJS中创建计算属性时,都会出现只读错误,但在我看来,这就像是在创建一个新对象:

  computed: {
    eventsFormatted: function () {
      var out = this.events
      for (var i in out) {
        out[i].startDate = moment(out[i].startDate)
        out[i].endDate = moment(out[i].endDate)
      }
      return out
    }
  }

我需要做什么来复制我可以修改的数组?

当您执行
var out=this.events
时,
out
var现在指向与
this.events
相同的对象数组

因此,如果
this.events
是只读的,则需要创建数组的副本,如果数组中的每个对象都是只读的,则还需要创建每个对象的副本

以下是使用复制阵列和对象的示例:

computed: {
  eventsFormatted() {
    let out = [...this.events];
    for (let i in out) {
      let item = {...out[i]};
      item.startDate = moment(item.startDate);
      item.endDate = moment(item.endDate);
      out[i] = item;
    }
    return out;
  }
}
上面的操作将创建阵列中每个对象的浅层副本。如果由于
this.events
的结构而需要进行深度复制