【发布时间】:2021-07-22 00:47:54
【问题描述】:
我在 firebase 实时数据库中有一个 javascript 对象,其结构类似于以下内容:
const obj = {
"quotes" : {
"Anon" : {
"-MZN5R9TUU5eLneHz2F_" : {
"quote" : "I am a quote",
"timestamp" : "1619616711347",
"htmlId" : "id517321"
}
},
"Secret Quoter" : {
"-D9NF75TGVSeJLABz1W_" : {
"quote" : "I am another quote",
"timestamp" : "1690016711317",
"htmlId" : "id519912"
},
"-DZNfR5THESeJLeHz1F_" : {
"quote" : "I am a different quote",
"timestamp" : "1349616899347",
"htmlId" : "id515618"
}
},
"General Kenobi" : {
"-MZR666TUUGeLneHzHF_" : {
"quote" : "Hello There",
"timestamp" : "1919616711347",
"htmlId" : "id511321"
}
}
}
};
现在我想根据每个对象的最高 timestamp 属性重新排序对象条目(假设每个引用作者的嵌入对象都按时间戳正确排序),因此在这种情况下解析的响应将是:
{
"quotes" : {
"General Kenobi" : {
"-MZR666TUUGeLneHzHF_" : {
"quote" : "Hello There",
"timestamp" : "1919616711347",
"htmlId" : "id511321"
}
},
"Secret Quoter" : {
"-D9NF75TGVSeJLABz1W_" : {
"quote" : "I am another quote",
"timestamp" : "1690016711317",
"htmlId" : "id519912"
},
"-DZNfR5THESeJLeHz1F_" : {
"quote" : "I am a different quote",
"timestamp" : "1349616899347",
"htmlId" : "id515618"
}
},
"Anon" : {
"-MZN5R9TUU5eLneHz2F_" : {
"quote" : "I am a quote",
"timestamp" : "1619616711347",
"htmlId" : "id517321"
}
}
}
};
我该怎么做呢?似乎有很多关于对对象数组进行排序的建议,但对于根据单个对象的实体的嵌入值实际排序的建议却没有。
编辑:感谢所有答案。总而言之,我通过重新设计我的 DB 模式完全避免了这个问题,以便 quotes 是一个对象数组,每个对象都有一个 author 属性。例如
{
"quotes" : [
{
"author" : "General Kenobi",
"quote" : "Hello There",
"timestamp" : "1919616711347",
"htmlId" : "id511321"
},
// More quotes here...
]
然后可以使用sort() 的传统方法将列表按最高时间戳向下排序。为了回答问题,我仍然会接受其中一个建议,但我建议读者在尝试订购对象之前考虑其对象的结构是否正确,因为使用数组更容易做到这一点.
【问题讨论】:
-
出于好奇(也许会导致更有意义的答案)...为什么在这种情况下对象属性的顺序很重要?该排序在哪里使用?
-
需要注意的一点是,根据 JS 引擎和版本,对象属性的顺序可能不一致或无法保证。在 JS 中,如果需要为集合中的项目指定顺序,通常会使用数组或其他数据结构
-
@David 顺序很重要,因为它们是如何被迭代和显示的。角度 ngFor 组件的不同部分需要读取此引用对象的不同部分(firebase db 显然比我在这里展示的要多)。为了首先显示最新的报价,我需要在表格中首先显示报价作者,然后是第二个作者及其报价,依此类推
-
您能否描述一下排序后您将如何遍历引号?我明白你想做什么,但不明白为什么
-
我建议您查看此 Q&A stackoverflow.com/questions/5525795/… 它解释了为什么您描述的任务不是最好的主意
标签: arrays typescript sorting object firebase-realtime-database