如何同时映射 2 个数组并根据 reactjs 中的条件更新数组

How to map over 2 arrays simultaneously and update the arrays according to condition in reactjs

在 React 中,我将数据从父组件传递到子组件 component.Both 这些组件有自己的独立状态,其中包含一系列书籍。

我正在将父组件的 books 数组传递给子组件 component.I 可以从子组件向父组件添加一本书。

在子组件中,我需要执行一个条件:如果子组件的books数组中有一个元素已经存在于父组件的books数组中,那么我需要更新一个属性 子组件中的书籍数组。

那么,如何映射两个数组并检查我的条件?

我正在尝试使用以下代码,但这行不通。我知道下面的代码不是正确的方法,但我不知道如何继续

let parent_books = this.props.books;
  this.state.child_books.map((book,index) => {
      if(book === parent_books[index])
          book.shelf = parent_books[index].shelf

    }) 

因此,父书籍数组中只有几本书已经存在于子书籍数组中。

所以我想检查父书籍数组中是否有一本子书籍数组中存在的书,然后我想将子书籍数组中的书架 属性 设置为 [=44] =] 父书籍数组中的书。

子组件中的所有书籍的初始书架 属性 为 "None"。

有人可以建议如何进行吗?

编辑

我正在尝试实现下面的代码 function.But 我在使用 setState 时遇到了一些问题。代码:

updateSearch = (searchString) => {
    let parent_books = this.props.books;
    this.setState({search: searchString.trim()})
    let searchResults = BooksAPI.search(this.state.search,1).then((book_search) => {
      if (book_search != undefined) {
        console.log(book_search)
          book_search.map((book) => book.shelf = 'none')
          this.setState({ books : book_search })
          console.log(this.state.books) //Gives the array of state
        }
    })

    console.log(this.state.books) //Gives an empty array
    this.state.books.map((book) => {
      const parent = parent_books.find(parent => parent === book );
      if(parent) {
        console.log(book.title);
        book.shelf = parent.shelf
      }
    })
  }

第二个 console.log 没有返回处于地图函数不在状态下的书籍数组 executed.What 我做错了吗?

不确定您的用例,但类似这样的方法可能有效:

componentWillReceiveProps(nextProps) {
    const {parent_books} = this.props;
    const {child_books} = this.state;
    if (parent_books !== nextProps.parent_books) {
      const books = child_books.map((child) => {
        const parent = parent_books.find(parent => parent.id === child.id);
        if (parent) {
          child.shelf = parent.shelf
        }
        return child;
      })
      this.setState({child_books: books});
    }
}

请注意 parent_books 应该是不可变的,以便 parent_books !== nextProps.parent_books 有效。您可能不想使用 index 作为查找(我在示例中使用虚构的 ID),因为父图书和子图书的订单必须保持同步。

既然要更新组件的状态,就需要用到setState。此外,map returns 一个数组,因此请使用 forEach;

componentDidMount(){
  this.state.child_books.forEach((book, i) => {
    if(book === parent_books[i]){
      this.setState({child_books: {shelf: [parent_books[i].shelf]}});
    }
  });
}