当我尝试使用 indexOf 和 splice 删除指定数组时,另一个值被删除
When I try to delete a specified array using indexOf and splice, another value is deleted
我们要解决的问题
我用 Vuex 管理我的价值观。我想删除事件数组中的给定值,我尝试使用 indexOf 和拼接删除该值,但它删除了屏幕上的另一个值。在服务器端,该值已成功删除,因此重新加载服务器 returns 正确的值。
是否为indexOf和splice指定的值有误?我想知道是什么原因造成的以及如何解决它。
#代码
数组数据
// I want to delete a specified value from an array containing a large amount of data.
[0 … 99]
[100 … 199]
[200 … 250]
0:
color: "#2196F3"
end: 1649116800000
id: 7
long_time: true
name: ""
post_id: null
start: 1649115900000
timed: true
updated_at: "2022-04-05T08:44:01.049+09:00"
・
・
・
・
店铺
export const state = () => ({
events: [],
})
export const mutations = {
deleteEvent(state, payload) {
state.events.splice(state.events.indexOf(payload), 1)
},
}
export const actions = {
deleteEvent ({ rootState, commit }, event) {
this.$axios.$delete(`${url.SCHEDULE_API}/${event.id}`)
.then(() => {
commit('deleteEvent', event)
・
・
・
・
})
},
}
** 组件**
// selectedEvent
{
color: (...)
created_at: (...)
end: (...)
id: (...)
long_term_id: (...)
long_time: (...)
name: (...)
post_id: (...)
start: (...)
timed: (...)
updated_at: (...)
}
methods: {
deleteEvent (event) {
this.selectedOpen = false
this.$store.dispatch('schedule/deleteEvent', this.selectedEvent)
},
}
Array.prototype.indexOf()
looks up an array element by its value using strict equality. This only works with primitive values.
由于 state.events[]
包含一个对象数组(不是原始数组),indexOf()
returns -1
因为找不到 non-primitive。将 -1
索引传递给 Array.prototype.splice()
会删除最后一个元素,从而导致您观察到的行为。
解决方案
要查找数组中的对象,请使用 Array.prototype.findIndex()
和一个回调,将其参数的 id
属性(或其他一些唯一标识符)与有效负载中的参数进行比较:
const index = state.events.findIndex(event => payload.id === event.id)
if (index > -1) {
state.events.splice(index, 1)
}
我们要解决的问题
我用 Vuex 管理我的价值观。我想删除事件数组中的给定值,我尝试使用 indexOf 和拼接删除该值,但它删除了屏幕上的另一个值。在服务器端,该值已成功删除,因此重新加载服务器 returns 正确的值。
是否为indexOf和splice指定的值有误?我想知道是什么原因造成的以及如何解决它。
#代码
数组数据
// I want to delete a specified value from an array containing a large amount of data.
[0 … 99]
[100 … 199]
[200 … 250]
0:
color: "#2196F3"
end: 1649116800000
id: 7
long_time: true
name: ""
post_id: null
start: 1649115900000
timed: true
updated_at: "2022-04-05T08:44:01.049+09:00"
・
・
・
・
店铺
export const state = () => ({
events: [],
})
export const mutations = {
deleteEvent(state, payload) {
state.events.splice(state.events.indexOf(payload), 1)
},
}
export const actions = {
deleteEvent ({ rootState, commit }, event) {
this.$axios.$delete(`${url.SCHEDULE_API}/${event.id}`)
.then(() => {
commit('deleteEvent', event)
・
・
・
・
})
},
}
** 组件**
// selectedEvent
{
color: (...)
created_at: (...)
end: (...)
id: (...)
long_term_id: (...)
long_time: (...)
name: (...)
post_id: (...)
start: (...)
timed: (...)
updated_at: (...)
}
methods: {
deleteEvent (event) {
this.selectedOpen = false
this.$store.dispatch('schedule/deleteEvent', this.selectedEvent)
},
}
Array.prototype.indexOf()
looks up an array element by its value using strict equality. This only works with primitive values.
由于 state.events[]
包含一个对象数组(不是原始数组),indexOf()
returns -1
因为找不到 non-primitive。将 -1
索引传递给 Array.prototype.splice()
会删除最后一个元素,从而导致您观察到的行为。
解决方案
要查找数组中的对象,请使用 Array.prototype.findIndex()
和一个回调,将其参数的 id
属性(或其他一些唯一标识符)与有效负载中的参数进行比较:
const index = state.events.findIndex(event => payload.id === event.id)
if (index > -1) {
state.events.splice(index, 1)
}