将对象数组保存到 firebase 而无需获取 0,1,2... 作为键

Save array of object to firebase without getting 0,1,2...as key

我有一个 javascript 对象数组,如下所示。

jsObjFromCsv = 
[ 
    {
        "J251525" : {
            "APPROVER" : "TOM@MAIL.COM",
            "JOB DESCRIPTION " : "CLEAN THE HOUSE",
            "JOB NUMBER" : "J251525"
        }
    }, {
        "J512912" : {
            "APPROVER" : "JAMES@MAIL.COM",
            "JOB DESCRIPTION " : "BRUSH HORSE",
            "JOB NUMBER" : "J512912"
        }
    }, {
        "J5-512" : {
            "APPROVER" : "HARRY@MAIL.COM",
            "JOB DESCRIPTION " : "WASH CAR",
            "JOB NUMBER" : "J5-512"
            }
    } 
]

但是,当我使用以下代码保存到 firebase 时,它​​看起来像这样

saveJobToFirebase(jobs: Array<Object>) {
    const jobCodesRef = this.af.database.list('/jobCodes/' +  this.currentUser.company)
    return jobCodesRef.push(jobs);
}

我想摆脱 0,1,2 这样我就可以查询终点

jobCodes/Company1/-Kc8Q5Wuq4M91puQ_70J/J251525

----------------我的尝试----------------

我想到了一个可行的方法,但它似乎并不像最后解释的那样好。

所以为了实现我想要的,我首先将我的对象数组更改为以下内容

[ 
    {
        "APPROVER" : "TOM@MAIL.COM",
        "JOB DESCRIPTION " : "CLEAN THE HOUSE",
        "JOB NUMBER" : "J251525"

    }, {
        "APPROVER" : "JAMES@MAIL.COM",
        "JOB DESCRIPTION " : "BRUSH HORSE",
        "JOB NUMBER" : "J512912"

    }, {
        "APPROVER" : "HARRY@MAIL.COM",
        "JOB DESCRIPTION " : "WASH CAR",
        "JOB NUMBER" : "J5-512"

    } 
]

然后我遍历每个对象并获取一个作业编号以获得终点并直接 "SET" 使用以下代码将其发送到 firebase

saveJobToFirebase(jobs: Array<Object>) {
    // previous code
    // const jobCodesRef = this.af.database.list('/jobCodes/' +  this.currentUser.company)
    // return jobCodesRef.push(jobs);

    // bad attempt?  
    for (let job of jobs) {
        const jobCodesRef = this.af.database.object('/jobCodes/' +  this.currentUser.company + '/' + job['JOB NUMBER']).set(job);
    }
}

这给了我想要的结果。

但是,这个方法有两个大问题

  1. 我的 saveJobToFirebase 不再 returns 一个 thenableReference 让我在我的组件中调用 .then。这意味着我将无法跟踪操作是否成功

  2. 我不知道用 for 循环更新 firebase 是否是个好主意?如果这个 JSON 对象有 2000 个条目怎么办...如果我在 for 循环中调用它,我会敲定终点。如果我可以 "push" 这样就更好了,一个请求就可以了?

创建 0、1、2 等是因为您正在保存对象数组。请参阅此 blog post about arrays in Firebase 以详细了解为什么存在此行为以及为什么 Firebase 建议不要存储数组。

调用 push() 将生成一个 so-called 推送 ID,Firebase 保证该值是唯一的。但由于您的作业已经有自己的 ID,因此也不需要。

想要保存的结构似乎更好:每个对象都有一个可用的键。您可以使用以下方式保存此对象:

jsObjFromCsv =  {
    "J251525" : {
        "APPROVER" : "TOM@MAIL.COM",
        "JOB DESCRIPTION " : "CLEAN THE HOUSE",
        "JOB NUMBER" : "J251525"
    },
    "J512912" : {
        "APPROVER" : "JAMES@MAIL.COM",
        "JOB DESCRIPTION " : "BRUSH HORSE",
        "JOB NUMBER" : "J512912"
    },
    "J5-512" : {
        "APPROVER" : "HARRY@MAIL.COM",
        "JOB DESCRIPTION " : "WASH CAR",
        "JOB NUMBER" : "J5-512"
        }
};

如果你仔细观察,你会发现我已经删除了数组和最外层的对象。

现在您可以使用以下方式保存此对象:

const jobCodesRef = this.af.database.list('/jobCodes/' +  this.currentUser.company)
jobCodesRef.update(jsObjFromCsv);

update() 中的 return 值是可用的,因此您可以在操作完成(或失败)后继续。

我有类似的问题,但在节点中,没有足够的答案。我知道你的代码不同,但原理是一样的。希望这对将来的人有帮助。首先 Firebase 可以通过推送或设置等不同方式保存数据。当使用带方括号的数组时,推送会自动添加这些数字,例如 0、1、2,这样说博客上的两个人 post 同时不会相互覆盖。 Set 忽略这一点并覆盖路径中的所有内容以按照您指定的方式保存数据。

在我的例子中,我使用 .push 将 json 个对象添加到数组中并获取 0、1、2,我想要名称而不是 0、1、2,所以我基本上只是切换了数组一个对象,而不是使用 .push 我在一个大对象中设置对象。为了说明这一点:

我先用的是:

var array = [];
jsonobject={
title:'title'
}

array.push(jsonobject);
//then I used push to firebase that array in an advanced method

修复:

var mybigjson = {};
var nameiwantinsteadofnumbers = [insert your changing variable for each jsonobject here]
jsonobject={
title:'title'
}

mybigjson[nameiwantinsteadofnumbers]=jsonobject
//then I used push to firebase that object in an advanced method

对于任何感兴趣的人,只需几行 reduce

就可以尝试将您的对象数组转换为一个对象
 const arrayToObject = (array) =>
   array.reduce((obj, item) => {
     obj[item.id] = item
     return obj
   }, {})
 const jsObjFromCsv_OBJ = arrayToObject(jsObjFromCsv)