尽管在主题上有很多线程,但我无法使用Array.filter
方法删除基于字符串的Array项。这是在Vuex商店发生突变的情况下的过滤方法。
UPDATE_FILTERS_GEOLOGIES: (state, payload) => {
if (state.filters.geologies.some(elem => elem === payload)) {
state.filters.geologies.filter(elem => !elem.includes(payload))
} else {
state.filters.geologies.push(payload);
}
}
过滤器方法已调用,但未删除该项目。我最终使用了Array.splice
方法:
let position = state.filters.geologies.indexOf(payload);
state.filters.geologies.splice(position, 1)
你能告诉我我在做什么错吗?
答案 0 :(得分:2)
直到splice()方法使原始数组发生突变,filter(),map()或some()方法将返回新数组,并保持原始数组不变。因此,您可以使用filter()方法,但随后应使用返回的数组替换原始数组。例如:
UPDATE_FILTERS_GEOLOGIES: (state, payload) => {
let g = state.filter.geologies
let p = payload
g.some(e => e === p)
? (g = { ...g.filter(e => !e.includes(p)) })
: g.push(p)
}
答案 1 :(得分:2)
基于MDN:
filter()方法创建一个新数组,该数组包含所有通过提供的功能实现的测试的元素。
所以基本上,您的代码中的错误是:
state.filters.geologies.filter(elem => !elem.includes(payload))
未保存在任何变量中,因此未使用过滤后的数组。为了使其正常工作,您需要分配filter
的返回值。像这样:
state.filters.geologies = state.filters.geologies.filter(elem => !elem.includes(payload))
或如弗拉迪斯拉夫所说:
state.filters.geologies = [...state.filters.geologies.filter(elem => !elem.includes(payload))]