按日期筛选 JavaScript 对象结构

3

我有一个Firebase数据库,按日期存储注册信息。每个日期的部分都是一个键。例如,对于日期2017-12-01,集合如下:

2017 {
    12 {
        01 {
           ...registers
        },
        02 {
           ...registers
        }
    }
}

这是一个图片示例

我认为设计这种结构的人(不是我)试图避免集合占用大量空间,这很好,但是:

我必须进行查询以过滤日期范围内的所有结果。选择一个起始日期和结束日期,您必须获取存储在其中的所有记录。

我写了类似于以下内容的代码:

for (let index_year in results) {
            if (parseInt(index_year) >= from_year && parseInt(index_year) <= to_year) {
                for (let index_month in results[index_year]) {
                    if(parseInt(index_month) >= from_month && parseInt(index_month) <= to_month) {
                        for (let index_day in results[index_year][index_month]) {
                            if(parseInt(index_day) >= from_day && parseInt(index_day) <= to_day) {

                                items = results[index_year][index_month][index_day];

                                for (let id in items) {
                                    console.log(items[id])
                                }
                            }
                        }
                    }
                }
            }
        }

当所选日期在同一年时,这个脚本可以正常工作。但是如果您选择了一个跨度为2017-12-01至2018-01-31的日期范围,则该脚本将不返回任何结果。

您能否想到更好的脚本来执行此查询?是否有人曾经做过类似的事情?


你能和我们分享一个JSON的真实例子吗?此外,它是否已排序? - Melchia
1个回答

0

您可以将所需范围作为带有适当访问器的数组,并使用数据映射此数组。然后删除结果集中的空洞。

在此示例中,范围从2017-11-292017-12-06,但并非所有日期都可用于对象。

如果没有日期或内部属性的路径可用,则返回undefined。这需要在映射后进行过滤。

getData与分层结构一起工作,并检查给定的属性。如果它获得falsy值,则会为访问获取一个(几乎)空对象,该对象可能返回undefined、对象或值。

var data = { 2017: { 11: { 28: { data: '2017-11-28' }, 30: { data: '2017-11-30' } }, 12: { '01': { data: '2017-12-01' }, '03': { data: '2017-12-03' }, '05': { data: '2017-12-01' } } } },
    range = [['2017', '11', '29'], ['2017', '11', '30'], ['2017', '12', '01'], ['2017', '12', '02'], ['2017', '12', '03'], ['2017', '12', '04'], ['2017', '12', '05'], ['2017', '12', '06']],
    getData = (object, path) => path.reduce((o, k) => (o || {})[k], object),
    result = range.map(date => getData(data, date)).filter(Boolean);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }


很好,@NinaScholz非常感谢你。现在我只需要考虑如何生成两个日期之间的范围数组生成器。 - Marcelo J Forclaz

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