Показать только информацию об этой дате - PullRequest
0 голосов
/ 10 июля 2020

У меня есть 4 даты 4 человек, я хочу указать имя человека, который добавил эту дату, но когда я выбираю день, массив просматривается 4 раза, и в одном из них появляется имя .. то есть до говорят, что массив путешествует со всеми людьми, но не только с тем, кого я хочу. например, на 17-й день, когда я выбираю его, появляются 2 предупреждения с ошибкой, третье с именем человека и четвертая ошибка предупреждения .. остальные похожи

Просмотр изображения

Код такой, интересующая функция infoDay

 constructor(props) {
    super(props);

    this.state = {
      selected: "",
      usuarios: [],
    };
  }

  componentDidMount() {
    firebase
      .database()
      .ref("DatosCli/")
      .on("child_added", (data) => {
        var datos = data.val();
        /*  alert(JSON.stringify(datos));  */
        var usuariosTemp = this.state.usuarios;
        datos.key = data.key;
        //Alert.alert("prueba",""+datos.longitud)
        usuariosTemp.push(datos);
        this.setState({ usuarios: usuariosTemp });
      });
  }

  cargarDatos = async () => {
    var userTemp = new Array();
    var data = await firebase.database().ref("/DatosCli").once("value");

    data.forEach((child) => {
      var user = child.val();
      user.key = child.key;
      userTemp.push(user);
    });
    this.setState({ usuarios: userTemp });
  };



   render() {
    const markedDates = {};
    this.state.usuarios.forEach((usuarioTemp) => {
      markedDates[usuarioTemp.date] = {
        selected: true,
        disableTouchEvent: false,
        selectedColor: "orange",
        selectedTextColor: "red",
      };
    });

    const infoDay = (day) => {
      this.state.usuarios.forEach((usuarioTemp) => {
        if (day.dateString == usuarioTemp.date) {
          alert(usuarioTemp.nombre);
        } else {
          alert("fail");
        }
      });
    };
    return (
      <View style={styles.container}>
        <CalendarList markedDates={markedDates} onDayPress={infoDay} />
      </View>
    );
  }

1 Ответ

0 голосов
/ 10 июля 2020

Если вы удалите инструкцию else, вы увидите только правильные предупреждения.

const infoDay = (day) => {
      this.state.usuarios.forEach((usuarioTemp) => {
        if (day.dateString == usuarioTemp.date) {
          alert(usuarioTemp.nombre);
        }
      });
    };

Если вы хотите пройти через определенного c пользователя, вы должны будете сделать dict с ним имена

Например:

let usuarioTemp = {
    firstUser:{day: 17},
    secondUser:{day: 19}
}

И ваша функция может быть:

const infoDay = (day, userName) => {
     if(usuarioTemp[userName].date === day){
        alert(userName);
     }
};

И, наконец, я полагаю, вы получаете такие данные:

[{nombre:"Name", date:17}, {nombre:"Name2", date:19}]

Вы можете использовать эту функцию:

function groupBy(array, key) {
  let arrayReduced = array.reduce(
    (result, { [key]: k, ...rest }) => {
      (result[k] = rest);
      return result;
    },
    {}
  );
  return arrayReduced;
}

, и вы увидите следующие данные:

{
"Name": {date: 17},
"Name2": {date: 19}
}

Test:

//Data example
let data = [{nombre:"Name", date:17}, {nombre:"Name2", date:19}]

//Function groupBy
function groupBy(array, key) {
  let arrayReduced = array.reduce(
    (result, { [key]: k, ...rest }) => {
      (result[k] = rest);
      return result;
    },
    {}
  );
  return arrayReduced;
}

//Usage
console.log(groupBy(data, "nombre"))

Надеюсь, это поможет!

...