Cuando ejecuto mi función y obtengo tres valores (título, identificación, fecha), necesito verificar si el título ya está en mi matriz (nombreArr) que resive para mi base de datos

Pero no funciona, los datos terminan en mi base de datos dos o tres veces

Mi código :

const subscribe = async (title, id, date) => {
    const movieRef = db.collection("Members")
    const snapshot = await movieRef.get()
    snapshot.forEach(doc => {
        if (doc.data().id == sessionStorage["id"]) {
            let nameArr = [...doc.data().subscribe_movie_name]
            if (nameArr.forEach(x => x.title == title)) 
            {
                console.log("pass")
            }
            else {
                nameArr.push({ title: title, id: id, date: date })
                db.collection('Members').doc(doc.id).update(
                    {
                        subscribe_movie_name: nameArr
                    })
                setCountSub(countSub + 1)
            }

        }

    })
0
yanir midler 21 ene. 2021 a las 23:36

1 respuesta

La mejor respuesta

Creo que el problema puede provenir de esta línea: if (nameArr.forEach(x => x.title == title))

La declaración "si" no evalúa x.title == title como la condición, que creo que es lo que quieres.

Para solucionar este problema, puede anidar la instrucción if dentro del bucle forEach y agregar una variable booleana para determinar si el título debe agregarse a la base de datos.

let addToDB = true
nameArr.forEach(x => {
  if (x.title == title) {
    // if title exists in nameArr, set addToDB to 'false'
    addToDB = false
  }
}
if (addToDB) {
    // add data to DB
}

Editar para agregar: también puede reemplazar .forEach con .some y mantener el resto de su código existente igual. (Consulte los '.some' documentos .)

1
kelsk 22 ene. 2021 a las 01:57