Как преобразовать 1d в 2d и сохранить его в состоянии react native?

#javascript #arrays #reactjs #react-native

#javascript #массивы #reactjs #react-native

Вопрос:

У меня есть массив,

 const array = [
{"row":"0", "column": "0"}, 
{"row":"0", "column": "1"},
{"row":"1", "column": "0"},
{"row":"1", "column": "1"}, 
{"row":"2", "column": "0"}, 
{"row":"2", "column": "1"}
]
  

Примечание: строки и столбцы не являются предопределенными, они могут меняться каждый раз.

Из массива мне нужно создать 2D-массив и сохранить его в состоянии в react native, чтобы я мог использовать состояние для отображения требований с использованием сохраненного массива,

У меня две проблемы: одна преобразует 1d в 2d, а другая сохраняет его в состояние an для дальнейшего использования,

Моя функция преобразования 1d в 2d:

 for (let i = 0; i < this.state.array.length; i  ) {
       let row = this.state.array[i].row;
            if (newSeats[row] === undefined) newSeats[row] = [];
               newSeats[row].push(this.state.array[i]);
       }

for (let i = 0; i < this.state.array.length; i  ) {
       let column = this.state.array[i].column;
             if (newSeatss[column] === undefined) newSeatss[column] = [];
               newSeatss[column].push(this.state.array[i]);
       }
  

Это дает два массива, так что это эффективный способ преобразовать 1d в 2d? И я не могу использовать setstate здесь, поскольку он выдает ошибку, указывающую максимальную глубину, достигнутую для setstate, так как сохранить результат в состоянии? и если есть какой-либо другой лучший способ сделать преобразование, пожалуйста, предложите!

И весь мой компонент :

 import React, { Component} from 'react';
import { View, Text, StyleSheet, ScrollView, Dimensions, TouchableOpacity, FlatList } from 'react-native';
import { connect } from 'react-redux';
import { fetchSeatLayout } from '../../actions/HomeActions';
import Loader from '../components/loader';
import { Feather } from '@expo/vector-icons';
import { Button } from 'react-native-elements';

const w = Dimensions.get('window').width;
const h = Dimensions.get('window').height;

class SeatLayout extends Component {

    state = { isLoading: true, selectedSeatLayouts: [], seatArray: [] }

    componentDidMount() {
        this.props.fetchSeatLayout(this.props.selectedBus.id, (data) => {
            this.setState({ isLoading : false, selectedSeatLayouts: data.seats })
        }) 
       
    }
   

    seats = () => {

        let arr2d = this.state.selectedSeatLayouts.reduce((r, {column, row, name }) => {
            if (!r[row]) r[row] = [];
            r[row][column] = name;
            return r;
        }, []);
          console.log(arr2d);
  
    }


    render() {
        
        return(
            <View style={styles.container}>
                <Loader
                    loading={this.state.isLoading} />

                <View style={{ flex: 1 }}>
                    <View style={styles.headerContainer}>
                        <View style={{ paddingTop: 50, paddingHorizontal: 20, alignItems: 'center' }}>
                            <Text>30 Sep, 2020</Text>
                        </View>
                    </View>
                    
                    <View style={styles.bodyContainer}>
                           {this.seats()}    
                    </View>
                </View>
            
            

            </View>
        )
    }
}


const styles = StyleSheet.create({
    container: {
        flex: 1,
        backgroundColor: '#fff'
    },
    headerContainer:{
        height: h * 0.23,
        backgroundColor: '#f0eff4',
    },
    bodyContainer:{
        justifyContent: 'center'
        
    },
});


const mapStateToProps = state => {
    return {
        selectedBus: state.home.userSelectedBus,
    }
}

export default connect(mapStateToProps, {fetchSeatLayout})(SeatLayout);
  

Ответ №1:

Обновите свой componentDidMount до этого, чтобы он сохранял 2D-массив в состоянии

 componentDidMount() {
  this.props.fetchSeatLayout(this.props.selectedBus.id, (data) => {
    this.setState({ isLoading : false, selectedSeatLayouts: data.seats},()=>{
      this.setState({seatArray:this.seats()})
    })
  }) 
}
  

Прямо сейчас seats функция ничего не возвращает, пожалуйста, обновите ее, чтобы вернуть что-нибудь

 seats = () => {
  let arr2d = this.state.selectedSeatLayouts.reduce((r, {column, row, name }) => {
      if (!r[row]) r[row] = [];
      r[row][column] = name;
      return r;
  }, []);
    console.log(arr2d);
  return arr2d;
}
  

На данный момент у вас есть состояние с параметром seatArray, теперь вы можете использовать его в соответствии с вашими требованиями.

Обновите этот блок кода, чтобы показать что-то вместо вызова 2darr,

 <View style={styles.bodyContainer}>
  {this.seats()} //remove this to show some visual component   
</View>