JavaScript 如何使用filter()方法删除嵌套数组中的指定元素
错误原因
你的原有代码存在两处逻辑问题:
- 外层对
todos调用filter方法时,返回值是过滤后的vpainfo数组,JS中非空数组会被判定为布尔值true,因此所有todo元素都会被保留,没有起到过滤修改的作用 - 你没有对todo对象的
vpainfo字段做赋值修改,原数组的vpainfo内容完全没有发生变化
正确实现
你可以用扩展运算符搭配map+filter实现需求,该写法不会修改原始state对象:
const newObj = { ...state, todos: state.todos.map(todoObj => ({ ...todoObj, vpainfo: todoObj.vpainfo.filter(({virAddrSeq}) => virAddrSeq !== "345") })) } console.log(newObj)
如果习惯用Object.assign写法,可以替换为如下版本:
const newObj = Object.assign({}, state, { todos: state.todos.map(todoObj => Object.assign({}, todoObj, { vpainfo: todoObj.vpainfo.filter(({virAddrSeq}) => virAddrSeq !== "345") })) })
逻辑说明
- 首先拷贝最外层的state对象,避免修改原始数据
- 对
todos数组调用map方法遍历每个todo对象,返回修改后的新todo对象 - 新的todo对象中,将
vpainfo字段替换为过滤掉virAddrSeq = "345"的新数组
内容的提问来源于stack exchange,提问作者vishnu
相关产品推荐
相关产品推荐

