我有一个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"
}
]
然后我循环遍历每个对象并获取一个作业号以获得终点并直接&#34; SET&#34;它使用以下代码到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);
}
}
这给了我想要的结果。
然而,这种方法存在两个大问题
我的saveJobToFirebase不再返回一个thenableReference让我在我的Component上调用.then。这意味着我无法跟踪操作是否成功
我不知道用for循环更新firebase是个好主意吗?如果这个JSON对象有2000个条目怎么办...如果我在for循环中调用它,我会敲定终点。如果我可以推动&#34;那会更好。这样一切都有一个请求吗?
答案 0 :(得分:2)
创建0,1,2等,因为您正在保存对象数组。有关此行为存在的原因以及Firebase建议不要存储数组的原因,请参阅此blog post about arrays in Firebase。
调用push()
会生成一个所谓的推送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()
的返回值是可以的,因此您可以在操作完成(或失败)后继续。
答案 1 :(得分:0)
我有类似的问题,但在节点中,没有答案证明是足够的。我知道你的代码不同但原理是一样的。希望这可以帮助将来的某个人。第一个Firebase可以通过推送或设置等不同方式保存数据。当使用带方括号的数组时,按下会自动添加0,1,2这样的数字,这样两个人在博客上发布的同时不会互相覆盖。设置忽略此项并覆盖路径中的所有内容以保存指定的数据。
在我的情况下,我将json对象添加到带有.push的数组中并获取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
答案 2 :(得分:0)
对于感兴趣的任何人,请尝试只用几行reduce即可将对象数组转换为对象
void print() {
if constexpr(std::is_base_of_v<T,Bar>) // ignores `Foo<int>`
t.print();
}