Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 反应删除对象数组中的元素_Javascript_Reactjs - Fatal编程技术网

Javascript 反应删除对象数组中的元素

Javascript 反应删除对象数组中的元素,javascript,reactjs,Javascript,Reactjs,删除对象数组中的元素时遇到问题。我只想删除数组中的一个对象。当我尝试使用.IndexOf()时。它还给了我-1。有没有一种方法可以做到这一点,而无需创建对每个对象的引用 这是我的对象数组 let todos = [{ id: 1, task: 'Finish This React App' },{ id: 2, task: 'Do Another App' },{ id: 3, task: 'Pass

删除对象数组中的元素时遇到问题。我只想删除数组中的一个对象。当我尝试使用.IndexOf()时。它还给了我-1。有没有一种方法可以做到这一点,而无需创建对每个对象的引用

这是我的对象数组

   let todos = [{
      id: 1,
      task: 'Finish This React App'
    },{
      id: 2,
      task: 'Do Another App'
    },{
      id: 3,
      task: 'Pass data from the parent to the child and reverse'
    }]

let task = {id:2,task:'Do Another App'}

let todosArray = this.props.todos

todosArray.indexOf(task,0) //= -1

总的来说,我只希望todos数组中有对象1和3。

您可以在纯香兰素ES6中使用过滤器:

var array = todos.filter(item => item.id === 1 || item.id === 3);
方法始终返回
-1
,因为对象引用不同

您可以使用方法

让todos=[{
id:1,
任务:“完成此应用程序”
}, {
id:2,
任务:“执行其他应用程序”
}, {
id:3,
任务:“将数据从父级传递到子级并反转”
}]
让任务={
id:2,
任务:“执行其他应用程序”
};
让keys=Object.keys(任务);
//按索引从数组中删除元素
托多斯剪接(
//获取元素的索引
todos.findIndex(函数(obj){
//检查所有属性值是否相等
返回键。每个(函数(k){
返回任务[k]==obj[k];
});
//如果只想检查'id'属性,则//可以避免使用上述代码并使用
//返回obj.id==task.id;
}), 1);

console.log(todos)
这不是react问题。@brian bier没有指定这一点,但在react中,在更改状态时,您不应修改原始值。我相信他的问题是关于实现这一点。不仅仅是从arraytodos中删除。splice会更改原始阵列,而在典型的react应用程序中管理状态时,您不希望更改原始阵列。如果是这种情况,您将希望使用todos.filter(…)创建一个包含修改内容的新数组。或者复制数组(todos=[…todos])并从副本中删除元素。这应该是经过验证的答案,但您可以通过另一种方式执行,并执行
todos.filter(item=>item.id!==2)