从状态数组中删除项目


130

故事是,我应该能够将鲍勃,莎莉和杰克放进盒子里。我也可以从包装盒中取出。卸下后,将不留任何插槽。

people = ["Bob", "Sally", "Jack"]

我现在需要删除“鲍勃”。新的数组将是:

["Sally", "Jack"]

这是我的react组件:

...

getInitialState: function() {
  return{
    people: [],
  }
},

selectPeople(e){
  this.setState({people: this.state.people.concat([e.target.value])})
},

removePeople(e){
  var array = this.state.people;
  var index = array.indexOf(e.target.value); // Let's say it's Bob.
  delete array[index];
},

...

在这里,我向您展示了一个最少的代码,因为它包含更多内容(onClick等)。关键部分是从数组中删除,删除,销毁“ Bob”,但removePeople()在调用时不起作用。有任何想法吗?我一直在看这个,但由于使用React,所以我可能做错了。

Answers:


169

要从数组中删除元素,只需执行以下操作:

array.splice(index, 1);

在您的情况下:

removePeople(e) {
  var array = [...this.state.people]; // make a separate copy of the array
  var index = array.indexOf(e.target.value)
  if (index !== -1) {
    array.splice(index, 1);
    this.setState({people: array});
  }
},

2
在我的情况下是:array.splice(array, 1);谢谢
Sylar

array.splice(array, 1);?我猜您需要对其进行编辑..您应该使用其他变量...
人造丝

60
使用React时,通常应避免直接改变状态。您应该创建一个新的Array并使用setState()
iaretiga '16

2
我建议在这种情况下使用Array.from(this.state.items)而不是传播运算符。这是因为Array.from专门用于此用途。
Francisco Hodge

2
小建议,在拼接数组之前添加“ index!== -1”检查以防止不必要的删除。
RoboBear

201

使用React时,切勿直接改变状态。如果Array更改了一个对象(或,它也是一个对象),则应创建一个新副本。

其他人建议使用Array.prototype.splice(),但是该方法会使Array发生变化,因此最好不要splice()与React 一起使用。

最容易用于Array.prototype.filter()创建新数组:

removePeople(e) {
    this.setState({people: this.state.people.filter(function(person) { 
        return person !== e.target.value 
    })});
}

42
是的,这是声明性的方式。使用prevState和arrow函数的另一种方法:this.setState(prevState => ({ people: prevState.people.filter(person => person !== e.target.value) }));
Josh Morel

9
这应该是永不变异状态的React习惯用法所接受的答案。
勒克斯

9
或使用索引:this.state.people.filter((_, i) => i !== index)
mb21

2
有一块是不可改变的并且可变的拼接
Cassian

这个答案的问题是,如果您有几个同名的人,则将所有这些人删除。如果您有
重复的话,

39

这是亚历山大·彼得罗夫(Alexandre Petrov)使用ES6的响应的一个小变化

removePeople(e) {
    let filteredArray = this.state.people.filter(item => item !== e.target.value)
    this.setState({people: filteredArray});
}

17

用于.splice从数组中删除项目。使用delete,数组的索引不会更改,但特定索引的值将是undefined

拼接()方法改变阵列的通过去除现有元件和/或添加新元素的内容。

句法: array.splice(start, deleteCount[, item1[, item2[, ...]]])

var people = ["Bob", "Sally", "Jack"]
var toRemove = 'Bob';
var index = people.indexOf(toRemove);
if (index > -1) { //Make sure item is present in the array, without if condition, -n indexes will be considered from the end of the array.
  people.splice(index, 1);
}
console.log(people);

编辑:

正如justin-grant所指出的那样,根据经验,切勿this.state直接进行变异,因为setState()事后致电可能会取代您所做的变异。对待this.state就好像它是不可变的。

替代方法是,在其中创建对象this.state的副本并操作这些副本,然后使用分配它们setState()Array#mapArray#filter等等,也可以被使用。

this.setState({people: this.state.people.filter(item => item !== e.target.value);});

3
确保不要使用拼接或任何直接更改状态变量的方法。相反,您需要创建数组的副本,将其从副本中删除,然后将副本传递到中setState。其他答案包含有关如何执行此操作的详细信息。
贾斯汀·格兰特

12

从状态数组中删除项目的简单方法反应:

当任何数据从数据库和更新列表中删除而没有API调用时,您将delete id传递给此函数,并且此函数从列表中删除已删除的记录

export default class PostList extends Component {
  this.state = {
      postList: [
        {
          id: 1,
          name: 'All Items',
        }, {
          id: 2,
          name: 'In Stock Items',
        }
      ],
    }


    remove_post_on_list = (deletePostId) => {
        this.setState({
          postList: this.state.postList.filter(item => item.post_id != deletePostId)
        })
      }
  
}


1
您能解释一下这与这个已有三年历史的其他8个答案有何不同吗?评论来自
Wai Ha Lee

在上面的代码中,它将重新创建新的数据数组,但跳过此ID的“ deletePostId”
ANKIT-DETROJA

使用item.post_id !== deletePostId
Nimish goel


3

首先定义一个值非常简单

state = {
  checked_Array: []
}

现在,

fun(index) {
  var checked = this.state.checked_Array;
  var values = checked.indexOf(index)
  checked.splice(values, 1);
  this.setState({checked_Array: checked});
  console.log(this.state.checked_Array)
}

1

您忘记了使用setState。例:

removePeople(e){
  var array = this.state.people;
  var index = array.indexOf(e.target.value); // Let's say it's Bob.
  delete array[index];
  this.setState({
    people: array
  })
},

但是最好使用filter它,因为它不会使数组变异。例:

removePeople(e){
  var array = this.state.people.filter(function(item) {
    return item !== e.target.value
  });
  this.setState({
    people: array
  })
},

1
removePeople(e){
    var array = this.state.people;
    var index = array.indexOf(e.target.value); // Let's say it's Bob.
    array.splice(index,1);
}

Redfer doc了解更多信息

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.