从Firebase获取的数组元素和长度值未定义

3

我能从数据库中获得一个数组,但我无法访问从数据库中获取的数组元素,既非arr[0]arr[1]...也非arr.length

这就是为什么在下面的toObject函数中,数组转换为对象的过程从未发生。即问题是arr.lengtharr[i]未定义。

那么,如何才能成功记录console.log(arr)呢?是的,它能够成功地显示arr

//Conversion function
const toObject = (arr) => {
    //If hardCodedArr attempted to convert, it is succesfully converted to object
    //let hardCodedArr= [
     // {"id":1, "isLocked": false, "name": "Cars"},
     // {"id":2, "isLocked": true, "name": "Planes"},
     // {"id":3, "isLocked": true, "name": "Trains"}
    //]
    
    //If array taken from Firebase, arr parameter, attempted to convert, it cannot reach to its sub-elements. i.e. arr[0], arr[1] ...
    // Therefore, conversion fails
    console.log("arr.length: ", arr.length)
    //arr.length: undefined  
    console.log("arr[0]: ", arr[0])
    //arr[0]: undefined  

    console.log("arr:", arr)
    //Displays the array!
    //arr: [
     // {"id":1, "isLocked": false, "name": "Cars"},
     // {"id":2, "isLocked": true, "name": "Planes"},
     // {"id":3, "isLocked": true, "name": "Trains"}
    //]

    //array to object conversion occurs here
    let rv = {}
    for (let i = 0; i < arr.length; ++i) {
            rv[i] = arr[i]
        }
    }
    console.log("rv:", rv)
    return rv
}

CategoriesScreen 是顶层组件,在其中所有这些内容发生。

const CategoriesScreen = () => {
         ReadAndWrite(ReadFirebase, WriteFirebase)
         ...
         ...
}

    const ReadAndWrite = async (function1, function2) => {
        try {
            const categoriesList = await function1() //reading array from Firebase
            console.log(categoriesList)
            let obj = toObject(categoriesList) 
            function2(obj); //sending to Firebase in which I didn't include details here
        } catch (error) {
            throw error
        }
    }

console.log(categoriesList)

类别列表的日志


const ReadFirebase= async () => {
    let topicsData;
    try {
        await database()
            .ref(`topics/`)
            .once('value')
            .then(snapshot => {
                topicsData = snapshot
            })
        return topicsData
    } catch (error) {
        throw error
    }
}

从数据库中获取 topics 节点。 这里是
1个回答

1
因为您的 arr 类型是 DataSnapshop。DataSnapshop 不是数组类型类,您需要将所有项转换或使用 foreach 循环遍历并创建新数组。
const ReadFirebase= async () => {
let topicsData;
try {
    await database()
        .ref(`topics/`)
        .once('value')
        .then(snapshot => {
            topicsData = snapshot.val()
        })
    return topicsData
} catch (error) {
    throw error
}

或者

const ReadFirebase= async () => {
let topicsData;
try {
    await database()
        .ref(`topics/`)
        .once('value')
        .then(snapshot => {
            snapshot.forEach(function(childSnapshot) {
            //add entity your topicdata
          });
        })
    return topicsData
} catch (error) {
    throw error
}

更多信息请参考此处此链接提供有关Firebase数据库快照的详细信息。


是的,第一种选项起作用了。我成功地将其转换为对象并将数据写入Firebase。你救了我的一天,非常感谢。 - Uygar Uçar
1
@UygarUçar 不客气 :) - Onur Gelmez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接