Javascript 按对象属性筛选对象数组在ReactJS中不起作用
我想通过生成的对象id从数组中删除对象 我已经尝试了多种解决方案,但没有任何效果 处理函数:Javascript 按对象属性筛选对象数组在ReactJS中不起作用,javascript,arrays,reactjs,Javascript,Arrays,Reactjs,我想通过生成的对象id从数组中删除对象 我已经尝试了多种解决方案,但没有任何效果 处理函数: handleDeleteTask = id => { const task = this.state.tasks.find(i => { return i.id === id; }); const newTasks = this.state.tasks.splice(task, 1); this.setState({ tasks: newTa
handleDeleteTask = id => {
const task = this.state.tasks.find(i => {
return i.id === id;
});
const newTasks = this.state.tasks.splice(task, 1);
this.setState({ tasks: newTasks });
};
JSX:
{this.state.tasks.map(task=>{
返回(
this.handleDeleteTask(task.id)}
/>
);
})}
第一个问题是,Array.prototype.splice
需要将要删除的项的索引作为第一个参数,而不是项本身。要改为查找索引,请将this.state.tasks.find
更改为this.state.tasks.findIndex
第二个问题是splice
返回数组中已删除的部分,而不是新数组,因此您需要将状态设置为只包含已删除的项
也许更简单的方法是使用Array.prototype.filter
删除不需要的项
handledeletask=id=>{
这是我的国家({
任务:this.state.tasks.filter(it=>it.id!==id)
})
}
第一个问题是,Array.prototype.splice
需要将要删除的项的索引作为第一个参数,而不是项本身。要改为查找索引,请将this.state.tasks.find
更改为this.state.tasks.findIndex
第二个问题是splice
返回数组中已删除的部分,而不是新数组,因此您需要将状态设置为只包含已删除的项
也许更简单的方法是使用Array.prototype.filter
删除不需要的项
handledeletask=id=>{
这是我的国家({
任务:this.state.tasks.filter(it=>it.id!==id)
})
}
编辑以反映评论中的建议
splice
返回移除的零件。您可以改为使用过滤器:
handleDeleteTask = id => {
const newTasks = [...this.state.tasks].filter(x => x.id !== id);
this.setState({ tasks: newTasks });
};
或展开原始状态,拼接副本并将其设置为新状态
handleDeleteTask = id => {
const task = this.state.tasks.findIndex(i => {
return i.id === id;
})
const newTasks = [...this.state.tasks]
newTasks.splice(task, 1)
this.setState({ tasks: newTasks });
};
实际上,这可以写在一行中
const removeById = id => this.setState({tasks: [...this.state.tasks].filter(x=> x.id !== id)})
编辑以反映评论中的建议
splice
返回移除的零件。您可以改为使用过滤器:
handleDeleteTask = id => {
const newTasks = [...this.state.tasks].filter(x => x.id !== id);
this.setState({ tasks: newTasks });
};
或展开原始状态,拼接副本并将其设置为新状态
handleDeleteTask = id => {
const task = this.state.tasks.findIndex(i => {
return i.id === id;
})
const newTasks = [...this.state.tasks]
newTasks.splice(task, 1)
this.setState({ tasks: newTasks });
};
实际上,这可以写在一行中
const removeById = id => this.setState({tasks: [...this.state.tasks].filter(x=> x.id !== id)})
仍然会错误地设置状态,但也会改变原始设置为什么@charlietfl?注释仅基于更改为findIndex。。。然后,状态将是被删除的内容,而不是你想说的拼接阵列。
state
typo把我甩了。另一件事是josh需要更新状态克隆上拼接的答案,这样你就不会直接变异。尽管如此,仍然会错误地设置状态以及变异原始状态。为什么@charlietfl?注释仅基于更改为findIndex。。。然后,状态将是被删除的内容,而不是你想说的拼接阵列。state
typo把我甩了。另一件事是josh需要更新状态克隆上拼接的答案,这样你就不会直接变异。答案的第二部分是不正确的。返回数组中的元素而不是索引。拼接采用固定的索引。谢谢你是的!可能也可以只使用findIndex进行一次迭代,而不是对同一事物进行两次扫描:)此外,我会更新答案的每个部分以克隆状态。。。即使filter
返回一个新数组,但通常最好克隆state对象,这样就不会忽略和意外地改变state。无论如何,我+1:)已更新。谢谢你的建议。你回答的第二部分不正确。返回数组中的元素而不是索引。拼接采用固定的索引。谢谢你是的!可能也可以只使用findIndex进行一次迭代,而不是对同一事物进行两次扫描:)此外,我会更新答案的每个部分以克隆状态。。。即使filter
返回一个新数组,但通常最好克隆state对象,这样就不会忽略和意外地改变state。无论如何,我+1:)已更新。谢谢你的建议。你不应该直接调用状态对象上的splicethis.state.tasks.splice
将改变状态,而是复制一个const newtask=[…this.state.tasks]
然后在newtask
变量上应用该拼接你不应该直接调用state对象上的splicethis.state.tasks.splice
将改变状态,而是复制const newTasks=[…this.state.tasks]
然后对newTasks
变量应用拼接