无法正确Array.filter

时间:2018-12-06 11:03:31

标签: javascript vue.js vuex

尽管在主题上有很多线程,但我无法使用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)

你能告诉我我在做什么错吗?

2 个答案:

答案 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))]